【问题标题】:set column default value of data table when filed with mysqldataadapter使用mysqldataadapter归档时设置数据表的列默认值
【发布时间】:2013-03-23 02:44:06
【问题描述】:

这是我现在的代码:

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 分钟对数据库只有 1,000 次点击,而不是可能有 40,000 次点击

【问题讨论】:

  • 是的,但表中的所有内容在 mysql 数据库本身中都有一个默认值,因此任何内容都不会返回 null。我只是想找出一种比使用 180 行代码更简单的方法来设置 30 个默认值,以便添加到表中
  • 我看到你正在从 sql 加载数据表并且你说每一列都会有一个值那么你为什么需要设置默认值?您可以做的是使用 MySQL Show Columns 获取列列表和默认值并遍历它并设置默认值
  • 用于添加到数据表时。有时我只需要设置 1 个值并让其余部分接受它们的“默认”值,而现在当我向其中添加一行但不设置所有列值时,我在使用表时遇到异常因为有些列是空的
  • 我正在为使用 websockets 的在线网络游戏使用专用服务器,当玩家创建初始城市时,首先需要设置的只是城市名称,所有其他值都应该是它们的默认值,并且有其中大约 30 多个,但目前就像我说的那样,它将它们设置为 null 而不是 0 或 50 或任何 mysql“默认”值是
  • 当稍后将数据从表中拉回并将其分配给一个类时,它会引发异常,因为例如 usercity.population 是一个 int 但表中的数据为空,它会抛出一个加载数据时出现异常

标签: c# mysql database


【解决方案1】:

根据 msdn 专家的说法,最终在他们的论坛上得到回复后,不可能获得默认值。您所能做的就是加载该值是否允许为空并且它的自动增量但是你必须设置种子并踩到自动增量它也没有从数据库中获取它但是他们提供了一个速记版本它减少到 30 行代码而不是 180 行

在调用 fillschema 然后填充数据表后,可以像这样简单地将其减少到一行而不是六行

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

在几次回复之后,甚至有一种更简单的方法可以做到这一点,而不是我想要的方式,但也许它会帮助其他人走上同一条路,而不是每列一行,这可以在 3 行中完成

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

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

【讨论】:

    【解决方案2】:

    所以我正在尝试做与您类似的事情(除了我不知道如何获取有关自动增量的信息)-我从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(我通过查询 DB 得到我的)和表的名称。

    出于某种原因,无论我做什么,时间戳和日期列都不喜欢它们的默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2012-11-09
      • 2013-10-23
      • 2013-11-23
      • 1970-01-01
      • 2016-07-19
      • 2018-09-09
      相关资源
      最近更新 更多