3

这是我现在的代码:

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 次点击

4

2 回答 2

3

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

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

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

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

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

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

于 2013-03-23T04:16:34.727 回答
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(我通过查询数据库得到我的)和表的名称。

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

于 2015-08-31T13:01:33.880 回答