使用mysqldataadapter归档时设置数据表的列默认值

时间:2013-03-23 02:44:06

标签: c# mysql database

这是我现在的代码:

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

2 个答案:

答案 0 :(得分:3)

根据msdn大师的说法,最终在他们的论坛上得到回复之后,它无法获得默认值。所有你能做的就是加载,允许该值为null并且使其自动增加但是你必须设置种子并踩上自动增量它不会从数据库中得到它但是它们给出了一个速记版本它低至30行代码而不是180行

在调用fillschema然后填充数据表之后可以简单地将其切割为一行而不是六行

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

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

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

id是主键,无法设置默认值

答案 1 :(得分: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(我通过查询数据库得到我的)和表的名称。

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

相关问题