设置使用mysqldataadapter归档时数据表的列默认值
本文关键字:数据表 默认值 mysqldataadapter 设置 | 更新日期: 2023-09-27 18:05:29
这是我现在的代码:
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(账户,SchemaType.Source);它设置允许空和自动增量,但不允许默认值
问题出现在稍后向数据表添加一行时,有时我只需要为一列设置值,而让其他列使用默认值。
我可以用180行代码来手动定义插入行的默认值但在创建/填充数据表时必须有一种方法从数据库中获取
我使用内存数据表,因为有时数据只存在2分钟,然后再次被删除,因为这是用于在线rts游戏的专用服务器。为了在数据库中保存点击量我使用数据表并对其进行操作每10分钟刷新一次这样每10分钟只有1000次点击到数据库而不是40000次点击
根据MSDN大师在他们的论坛上最终得到的回应,它不可能得到默认值。你所能做的就是加载值是否被允许为空以及是否为自动递增但你仍然需要设置种子并踩上自动递增它也不会从数据库中获取这些但是他们给出了一个简短的版本将代码减少到30行而不是180行
在调用fillschema之后,然后填充数据表可以简单地这样做,这将它减少到一行而不是六行
Cities.Columns["wood"].DefaultValue = 0;
在一些回复之后,甚至有一个更简单的方法来做到这一点,不是我想要的方式,但也许它会帮助其他人走同样的路,而不是每列一行,这使它们都在3行
foreach (DataColumn col in Cities.Columns) {
if (col.ColumnName != "id") col.DefaultValue = 0;
}
id是主键,不能设置默认值
所以我试图做一些类似于你的事情(除了我不知道如何获得有关自动增量的信息)-我从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获得我的值)和表名。
无论我怎么做,时间戳和日期列都不喜欢它们的默认值。