我在C#中有这个代码,但我需要它来选择除表的第一列(标识列)之外的所有列,这样当我将数据插入到不同数据库中的相同表中时,目标数据库会分配它自己的标识列值:
SqlCommand commandSourceData = new SqlCommand($"SELECT * FROM dbo.{tableName};", sourceConnection);
SqlDataReader reader = commandSourceData.ExecuteReader();
有没有办法做到这一点?
如果您想为数据库中的每个列提供通用解决方案,则可以使用此类代码
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);
}
现在,您可以使用返回的字符串构建不带autoincrement列的Sql语句。 请注意,此代码易受Sql注入攻击。您应该完全确定用于构建第一个查询的tableName参数不是由您的用户直接键入的。让它从预定义表的白名单(只读)中进行选择(这也不是100%安全)
另一个缺点是你需要两次点击数据库。一旦获得具有关于AutoIncrement列的信息的模式,并在此之后填充数据表。