【发布时间】:2018-10-11 07:39:10
【问题描述】:
我有这个错误:
Invalid object name 'sap.AfdelingsrapportACTUAL'.
这是因为这个表还没有创建。
我需要在我的SqlDataAdapter 中进行检查 - 所以如果为空或没有得到任何东西,它会继续前进。但我真的不知道该怎么做。
我认为它应该在我的 SqlDataAdapter 周围,但我可能错了
代码
DataTable sqldt = new DataTable();
string sqlQuery = @"Select * from " + table;
SqlConnection sqlcon = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(sqlQuery, sqlcon);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(sqldt);
}
我认为它应该是什么样子:
public static bool CompareDataTables(DataTable dt, string table, string connectionString)
{
DataTable sqldt = new DataTable();
string sqlQuery = @"Select * from " + table;
SqlConnection sqlcon = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(sqlQuery, sqlcon);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
if (da == "doesnt have any table")
{
return true;
}
else
{
da.Fill(sqldt);
}
}
int sqlCols = sqldt.Columns.Count;
int excelCols = dt.Columns.Count;
if (excelCols == sqlCols)
{
return false;
}
else return true;
}
【问题讨论】:
-
你应该先检查表是否存在:stackoverflow.com/questions/167576/…
-
如果只是要比较表中的列数,为什么要选择所有行(
SELECT *无条件)? -
@John 是的,我可以做到。我只是希望我可以用一个聪明的 C# 特性来解决它
-
@Thomas 您可以使用
SELECT TOP 0 *,例如,不会返回任何数据。或者,如果您只是要比较表架构,则可以使用SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'yourtablename'选择此信息(如果您使用的是 sqlserver - 您的问题并不清楚) -
@Thomas 不确定。我猜你可以捕捉到命令失败时发生的 SqlException 。但这感觉相当hacky。为什么不从 information_schema 中选择您真正想要的数据?这样你可以比较行,如果表不存在,你不会得到错误,而只是一个空的数据表。
标签: c# sql-server-2017 sqldataadapter