[英]How to map SQL Server tables to DataTables correctly?
我编写了一种将表从SQL Server复制到.NET-DataTable的方法:
public static DataTable SQLtoDataTable(string _connectionString, string _tableName)
{
DataTable dt = new DataTable();
string queryString = "SELECT * FROM " + _tableName;
using (SqlConnection connection = new SqlConnection(_connectionString))
{
using (SqlCommand queryCMD = new SqlCommand(queryString))
{
using (SqlDataAdapter da = new SqlDataAdapter(queryCMD))
{
queryCMD.Connection = connection;
connection.Open();
da.Fill(dt);
connection.Close();
}
}
}
return dt;
}
不幸的是,这种方法似乎无法100%正确地工作。 当列和行数据按1:1传输时,似乎AllowDBNULL
中的每个列的AllowDBNULL
值都设置为true
,无论该值设置为true
还是false
。 我会错过什么吗?还是有更好的方法将这种信息插入到DataTable
?
看看将SqlDataAdapter.FillSchema方法与代码一起使用。
将DataTable添加到DataSet并配置架构以匹配数据源中的架构。
作为示例,还可以查看DbDataAdapter.FillSchema方法(DataSet,SchemaType)
FillSchema操作将DataTable添加到目标DataSet。 然后,它将列添加到DataTable的DataColumnCollection中,并配置以下DataColumn属性(如果它们存在于数据源中):
•AllowDBNull
• 自动递增。 您必须分别设置AutoIncrementStep和AutoIncrementSeed。
• 最长长度
• 只读
• 独特
FillSchema还根据以下规则配置PrimaryKey和Constraints属性:
•如果SelectCommand返回一个或多个主键列,则它们将用作DataTable的主键列。
•如果没有返回主键列,但返回唯一列,则仅当所有唯一列均不可为空时,才将唯一列用作主键。 如果任何列可为空,则将UniqueConstraint添加到ConstraintCollection,但是未设置PrimaryKey属性。
•如果同时返回了主键列和唯一列,则主键列将用作DataTable的主键列。
使用的例子
DataSet dataSet = new DataSet(dataSetName);
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT CustomerID, CompanyName, ContactName FROM dbo.Customers", connection);
DataTableMapping mapping = adapter.TableMappings.Add("Table", "Customers");
mapping.ColumnMappings.Add("CompanyName", "Name");
mapping.ColumnMappings.Add("ContactName", "Contact");
connection.Open();
adapter.FillSchema(dataSet, SchemaType.Mapped);
adapter.Fill(dataSet);
return dataSet;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.