2016-08-10 92 views
0

我必須在SQL Server上創建數據庫的副本。 在這樣我到了新的DB如何在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數據庫,但無法在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(); 


     } 

它不會在DB更改屬性

回答

0

這個問題部分解決

columne.Properties["Autoincrement"].Value = (bool)dbInfo.Autoincrement; 

因爲dbInfo.Autoincrement是一個對象我必須寫(bool)dbInfo.Autoincrement

沒有解決是這樣的

columne.Properties["Default"].Value = (string)dbInfo.Default_Value; 

因爲值DEFAULT_VALUE的類型可以是0,空(「」)或「 - 」 ......我不知道我能在這種情況下做

相關問題