如何在SQL Server中设置列属性

时间:2016-08-10 07:51:33

标签: c# oledb adox

我必须在SQL Server上创建数据库副本。 通过这种方式,我得到了与新数据库的连接

 ADODB.Connection connection = new ADODB.Connection();

        OleDbConnectionStringBuilder builder = new System.Data.OleDb.OleDbConnectionStringBuilder();
        builder["Provider"] = provider;
        builder["Server"] = @"Themis\DEV";
        builder["Database"] = file_name;
        builder["Integrated Security"] = "SSPI";
        string connection_string = builder.ConnectionString;
        connection.Open(connection_string, null, null, 0);

        return connection;
    }

我用ADOX

创建表格
 ADOX.Catalog cat, Dictionary<string, ADOX.DataTypeEnum> columntype)
    {
        List<string> primaryKeysList = GetPrimaryKey(tabelle);
        Key priKey = new Key();

        Catalog catIn = new Catalog();
        catIn.ActiveConnection = dbInfo.ConIn;
        Dictionary<string, List<string>> indexinfo = new Dictionary<string, List<string>>();
        GetSecondaryIndex(tabelle, indexinfo);
        if (columntype.Count != 0) columntype.Clear();

        if (size.Count != 0) size.Clear();

        foreach (DataRow myField in schemaTable.Rows)
        {
            String columnNameValue = myField[columnName].ToString(); //SpaltenName
            bool ich_darf_dbnull_sein = (bool)myField["AllowDBNull"];


            ADOX.Column columne = new ADOX.Column();
            columne.ParentCatalog = cat;
            columne.Name = columnNameValue;

            if (!columntype.ContainsKey(columnNameValue))
            {
                columntype.Add(columnNameValue, (ADOX.DataTypeEnum)myField["ProviderType"]);
            }
            columne.Type = (ADOX.DataTypeEnum)myField["ProviderType"];
            //type.Add((ADODB.DataTypeEnum)myField["ProviderType"]);
            columne.DefinedSize = (int)myField["ColumnSize"];
            dbInfo.ColumnName = columnNameValue;
            dbInfo.TableName = tabelle;

            dbInfo.Column_size = (int)myField["ColumnSize"];
            dbInfo.Column_Type = (ADOX.DataTypeEnum)myField["ProviderType"];
            size.Add((int)myField["ColumnSize"]);
            if (primaryKeysList.Contains(columnNameValue))
            {
                dbInfo.IsPrimary = true;
            }
            else dbInfo.IsPrimary = false;

            object index = catIn.Tables[tabelle].Columns[columnNameValue].Attributes;
            if (index.Equals(ColumnAttributesEnum.adColFixed) || (int)index == 3)
                dbInfo.Fixed_length = true;
            else
                dbInfo.Fixed_length = false;

            Console.WriteLine("{0}={1}", myField[columnName].ToString(), catIn.Tables[tabelle].Columns[columnNameValue].Attributes);

                TargetDBMS.SetColumnProperties(columne, dbInfo);



            switch (columne.Type)
            {
                case ADOX.DataTypeEnum.adChar:
                case ADOX.DataTypeEnum.adWChar:
                case ADOX.DataTypeEnum.adVarChar:
                case ADOX.DataTypeEnum.adVarWChar:
                    columne.DefinedSize = (int)myField["ColumnSize"];
                    break;
                default:
                    break;
            }
            if (primaryKeysList.Contains(columnNameValue))
            {
                priKey.Name = "PK_" + tabelle + "_" + columnNameValue;
                primaryKeysList.Remove(columnNameValue);
                priKey.Columns.Append(myField[columnName], (ADOX.DataTypeEnum)myField["ProviderType"], (int)myField["ColumnSize"]);

            }
            columnNameList.Add(columnNameValue);

            table.Columns.Append(columne);
        } 
        table.Keys.Append((object)priKey, KeyTypeEnum.adKeyPrimary);
    }

但是当我为列设置属性时,我得到了一个例外

 internal override void SetColumnProperties(ADOX.Column columne, DbInfo dbInfo)
    {
        GetColumnProperties(dbInfo);
                columne.Properties["Autoincrement"].Value = dbInfo.Field_prop["Autoincrement"];
                columne.Properties["Default"].Value = dbInfo.Field_prop["Default"];
                columne.Properties["Nullable"].Value = dbInfo.Field_prop["Nullable"];
    }

我的程序适用于Access DB,但我无法为SQL Server上的数据库设置它

  

异常(0x80040E21)多步OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有工作。

如果我这样试试

string query = "SELECT * FROM Forms";
 DataTable dt = new DataTable();
            using (SqlConnection sqlConn = Connection())
            using (SqlCommand cmd = new SqlCommand(query, sqlConn))
        {
            sqlConn.Open();

            dt.Load(cmd.ExecuteReader());

        }


        foreach (DataColumn col in dt.Columns)
        {
            Console.WriteLine(col.ColumnName);
            col.AllowDBNull = true;
            dt.AcceptChanges();
            col.AutoIncrement = false;
            dt.AcceptChanges();


        }

它不会更改数据库中的属性

0 个答案:

没有答案