2013-03-23 62 views
3

提起这是我的代码现在:组列的缺省值与个MySqlDataAdapter

private static MySqlConnection conn = null; 
private static MySqlDataAdapter AccountsDa = null; 
private static MySqlCommandBuilder AccountsCb = null; 
AccountsDa = new MySqlDataAdapter("SELECT * FROM accounts", conn); 
AccountsCb = new MySqlCommandBuilder(AccountsDa); 
Accounts = new DataTable(); 
AccountsDa.Fill(Accounts); 

我试图找出如何定义列的默认值,无需手工 做如果我这样做:为每个科拉姆

DataColumn col = new DataColumn(); 
col.ColumnName = "id"; 
col.AllowDBNull = false; 
col.DataType = System.Type.GetType("System.Int32"); 
col.DefaultValue = 0; 
Accounts.Columns.Add(col); 

它工作正常,但我怎么都自动从数据库表时被填充设置的默认值。我希望我不必亲自定义30列。

我试过了Accountsda.FillSchema(Accounts,SchemaType.Source); 其中规定了允许空值和自动增量而不是默认值

问题棱后来添加一行到数据表时,有时我只需要设置的值一列,让其他列则诉诸他们的默认值。

我可以把180行的代码手动定义用于插入行中的默认值,但必须有创建时抓住从数据库中的方式/填充数据表

我使用在存储器数据表,因为有时候数据只会存在2分钟,然后再次被删除,因为这是针对在线rts游戏的专用服务器。所以为了保存数据库中的命中我正在使用数据表并操作它们并每10分钟刷新一次,以便每10分钟只有1000次点击到数据库,而不是可能的40,000次点击

+0

是的,但表中的所有内容在mysql数据库本身都有一个默认值,所以没有任何内容会返回null。我只是想找出一个更简单的方法,比180行代码设置30个默认值时添加到表 – BrierMay 2013-03-23 03:32:58

+0

我看到你正在从SQL加载数据表,你说每列都会有一个值,那么为什么你需要设置默认值?你可以做的是使用MySQL [Show Columns](http://dev.mysql.com/doc/refman/5.0/en/show-columns.html)来获取列和默认值列表并循环并设置当添加到数据表时,默认值为 – 2013-03-23 03:36:47

+0

。有时候我只需要设置1个值,让其余的接受它们的“默认”值,现在当我向它添加一行但不设置所有列值时,我在使用表时遇到异常因为有些列是空的 – BrierMay 2013-03-23 03:40:39

回答

3

根据msdn权威在他们的论坛上最终得到回应后,无法获得默认值。你所能做的只是加载它的值,允许它的值为空,并且它的自动增量,但是你必须设置种子并且自动增量,它不能从数据库获得,但是他们给出了一个速记版本主叫FillSchema的再填充所述数据表后它下降到30行的代码,而不是180

可以简单地做这样至极削减它下降到一个行,而不是六个

Cities.Columns["wood"].DefaultValue = 0; 

几回复后甚至还有一种更简单的方式来做到这一点,而不是我想要的方式,但也许它会帮助其他人沿着同一条路而不是每条线的一条线,这些都是在3条线上的。

foreach (DataColumn col in Cities.Columns) { 
    if (col.ColumnName != "id") col.DefaultValue = 0; 
} 

id是主键,并且不能设置默认值

1

所以我试图做类似的东西给你(除非我不知道如何获取有关自动增量的信息) - 我从https://stackoverflow.com/a/12731310/222897

private void AssignMandatoryColumns([NotNull] DataTable structure, string tableName) 
    { 
     // find schema 
     string[] restrictions = new string[4]; // Catalog, Owner, Table, Column 
     restrictions[2] = tableName; 
     DataTable schemaTable = _dbCon.GetSchema("Columns", restrictions); 
     if (schemaTable == null) return; 

     // set values for columns 
     foreach (DataRow row in schemaTable.Rows) 
     { 
      string columnName = row["COLUMN_NAME"].ToString(); 
      if (!structure.Columns.Contains(columnName)) continue; 
      if (row["IS_NULLABLE"].ToString() == "NO") structure.Columns[columnName].AllowDBNull = false; 

      //if (structure.Columns[columnName].AutoIncrement) continue; // there can be no default value 
      var valueType = row["DATA_TYPE"]; 
      var defaultValue = row["COLUMN_DEFAULT"]; 
      try 
      { 
       structure.Columns[columnName].DefaultValue = defaultValue; 
       if (!structure.Columns[columnName].AllowDBNull && structure.Columns[columnName].DefaultValue is DBNull) 
       { 
        Logger.DebugLog("Database column {0} is not allowed to be null, yet there is no default value.", columnName); 
       } 
      } 
      catch (Exception exception) 
      { 
       if (structure.Columns[columnName].AllowDBNull) continue; // defaultvalue is irrelevant since value is allowed to be null 
       Logger.LogWithoutTrace(exception, string.Format("Setting DefaultValue for {0} of type {1} {4} to {2} ({3}).", columnName, valueType, defaultValue, defaultValue.GetType(), structure.Columns[columnName].AllowDBNull ? "NULL" : "NOT NULL")); 
      } 
     } 
    } 

上心,函数将DataTable中要设置和表的名称(我通过查询数据库获取矿)的值。

由于某些原因,无论我做什么,时间戳记和日期列都不喜欢其默认值。