【发布时间】:2019-01-28 14:04:24
【问题描述】:
编辑:很抱歉浪费大家的时间,下面的代码表明我刚刚忘记了 C_TABLE 上的“C”,在更正后可以正常工作。
如果表存在于数据库中,则在以下代码中“存在”应该 == 1。但是,它为我返回 0,即使该表存在于数据库中。我不确定为什么会这样?
谢谢:
foreach (var row in calcSched)
{
var dif3 = new DataInterfaceFactory(DatabaseTypes.SqlServer, row.DatabaseName, row.ServerName);
using (DataReader dr2 = dif3.GetDataReader())
{
dr2.ExecuteReader("SELECT COUNT(1) AS TABLECOUNT2 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'C_TABLE'");
var exists = Convert.ToInt32(dr2["TABLECOUNT2"]);
CommandExecutor CE = dif3.GetCommandExecutor();
try
{
if (exists == 0)
{
string sql = "CREATE TABLE dbo.C_TABLE(COLUMN_UID INT, KIP INT, SD_DATE DATE, ST INT, CS_DATE DATE, CE_DATE DATE, SM CHAR(100), PRG CHAR(20)";
CE.ExecuteNonQuery(sql);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: could not create C_TABLE");
}
}
}
【问题讨论】:
-
“我的理解是至少需要一行才能返回 1” - 我不会这么认为,不;只要它存在,它就应该适用于空表;你测试过这个假设吗? (我刚刚做了:效果很好)
-
空行集上的
COUNT(..)始终存在并且为0(嗯,很明显)。ExecuteScalar就是你所需要的。 -
@JeroenMostert 是的,但是它使用异常作为“不,它不存在”的情况 - 通常不是一个好主意,但是......它会起作用,我猜
-
@LasseVågsætherKarlsen 抱歉,我完全错了。我已经编辑了这个问题。因为表存在,它应该返回 1,而不是 0。目前,由于它返回 0,并且由于它已经存在而无法创建表,所以它正在抛出错误。
-
如果您发布的代码准确无误,请检查
DataReader的实际含义以及ExecuteReader应该做什么。看起来这不是使用 ADO.NET 标准类,而是使用一些自定义层,它可以对您的查询做各种有趣的事情——它可以以人类未知的方式包装或破坏它。您也可能只是转到错误的服务器或数据库,再次基于我们在这里看不到的一些动态配置。
标签: c# sql-server database datareader