2013-03-23 64 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中要設置和表的名稱(我通過查詢數據庫獲取礦)的值。

由於某些原因,無論我做什麼,時間戳記和日期列都不喜歡其默認值。