2016-08-10 3 views
0

Мне нужно создать копию базы данных на SQL Server. На этом пути я получил подключение к новой БДКак установить свойства столбца в 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

Проблема частично решается

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

потому что dbInfo.Autoincrement был объект мне нужно написать (bool) dbInfo.Autoincrement

Не решена эта

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

, поскольку тип значения DEFAULT_VALUE может быть 0, пустой («») или «-» ... Я не знаю, что я могу сделать в этом случае

Смежные вопросы