我在C#中有这个代码,但我需要它来选择所有列,除了表的第一列(标识列),这样当我将数据插入到不同数据库中的相同表中时,目标数据库分配自己的标识列值:
SqlCommand commandSourceData = new SqlCommand($"SELECT * FROM dbo.{tableName};", sourceConnection);
SqlDataReader reader = commandSourceData.ExecuteReader();
有办法做到这一点吗?
答案 0 :(得分:4)
如果您想为数据库中的每一列提供通用解决方案,则可以使用此类代码
public string GetColumnsWithoutIdentity(string tableName, SqlConnection con)
{
SqlDataAdapter da = new SqlDataAdapter($"SELECT * FROM dbo.{tableName} where 1=0", con);
DataTable dt = new DataTable();
da.FillSchema(dt, SchemaType.Source);
var cols = dt.Columns.Cast<DataColumn>().Where(x => !x.AutoIncrement).Select(x => x.ColumnName);
return string.Join(",", cols);
}
现在,您可以使用返回的字符串构建不带自动增量列的Sql语句 请注意,此代码易受Sql注入攻击。您应该完全确定用于构建第一个查询的 tableName 参数不是由您的用户直接键入的。让它从预定义表格的白名单(只读)中进行选择(这也不是100%安全)
另一个缺点是你需要两次点击数据库。一旦获得具有关于AutoIncrement列的信息的模式,并在此之后填充数据表。