gpt4 book ai didi

c# - 如何以编程方式确定表是否存在于 SQL Server CE 数据库中?

转载 作者:太空狗 更新时间:2023-10-30 00:10:41 25 4
gpt4 key购买 nike

当我的 .sdf 文件中只有一个表时,这段代码工作正常:

const string sdfPath = @"\Program Files\duckbilled\Platypus.sdf";
string dataSource = string.Format("Data Source={0}", sdfPath);

if (!File.Exists(sdfPath))
{
using (var engine = new SqlCeEngine(dataSource))
{
engine.CreateDatabase();
}
using (var connection = new SqlCeConnection(dataSource))
{
connection.Open();
using (var command = new SqlCeCommand())
{
command.Connection = connection;
command.CommandText =
"CREATE TABLE Platydudes (Id int NOT NULL, BillSize smallint NOT NULL, Description nvarchar(255)";
command.ExecuteNonQuery();
}
}
}

...但现在我需要知道的不是数据库文件 (Platypus.sdf) 是否存在,而是特定的(例如 Platydudes) 存在于该表/文件中。有办法确定吗?

更新

查询中的“IF NOT EXISTS”子句导致运行时异常。这段代码:

using (var connection = new SqlCeConnection(dataSource))
{
connection.Open();
using (var command = new SqlCeCommand())
{
command.Connection = connection;
command.CommandText = "IF NOT EXISTS( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'InventoryItems') " +
"CREATE TABLE InventoryItems (Id nvarchar(50) NOT NULL, PackSize smallint NOT NULL, Description nvarchar(255), DeptDotSubdept numeric, UnitCost numeric, UnitList numeric, UPCCode nvarchar(50), UPCPackSize smallint, CRVId int);";
command.ExecuteNonQuery();
}
}

...导致抛出此异常:解析查询时出错。 [ token 行号 = 1, token 行偏移量 = 1, token 错误 = IF]

很明显,查询解析器不需要“IF”业务。如果表尚不存在,还有另一种方法可以只创建表吗?或者我应该每次都先删除表然后重新创建它? IOW,我应该这样做吗:

using (var connection = new SqlCeConnection(dataSource))
{
connection.Open();
using (var command = new SqlCeCommand())
{
command.Connection = connection;
command.CommandText = "DELETE InventoryItems";
command.ExecuteNonQuery();
}
using (var command = new SqlCeCommand())
{
command.Connection = connection;
command.CommandText = "CREATE TABLE InventoryItems (Id nvarchar(50) NOT NULL, PackSize smallint NOT NULL, Description nvarchar(255), DeptDotSubdept numeric, UnitCost numeric, UnitList numeric, UPCCode nvarchar(50), UPCPackSize smallint, CRVId int);";
command.ExecuteNonQuery();
}
}

?

更新 2

在第一次更新中回答我上面的问题:不!如果这样做,我会在第二次调用 .ExecuteNonQuery() 时收到“指定的表已存在”。

更新 3

回应 Shiva 对我的回答的评论:

这(重用命令对象)以同样的方式失败(“表已存在”):

using (var command = new SqlCeCommand())
{
command.Connection = connection;
command.CommandText = "DELETE InventoryItems";
command.ExecuteNonQuery();
command.CommandText = "CREATE TABLE InventoryItems (Id nvarchar(50) NOT NULL, PackSize smallint NOT NULL, Description nvarchar(255), DeptDotSubdept numeric, UnitCost numeric, UnitList numeric, UPCCode nvarchar(50), UPCPackSize smallint, CRVId int);";
command.ExecuteNonQuery();
}

最佳答案

SQL Compact 不太喜欢 SQL 语句中的逻辑,因此 Shiva 的答案可能无法通过解析器。不过,他走在正确的道路上。您可以分两步完成:

这是来自 OpenNETCF ORM 的 SQL Compact 实现的 TableExists 方法:

public override bool TableExists(string tableName)
{
var connection = GetConnection(true);
try
{
using (var command = GetNewCommandObject())
{
command.Transaction = CurrentTransaction as SqlCeTransaction;
command.Connection = connection;
var sql = string.Format(
"SELECT COUNT(*) FROM information_schema.tables WHERE table_name = '{0}'",
tableName);
command.CommandText = sql;
var count = Convert.ToInt32(command.ExecuteScalar());

return (count > 0);
}
}
finally
{
DoneWithConnection(connection, true);
}
}

显然您的情况并不完整,但很容易理解。 CurrentTransaction 很容易为空。 GetNewCommandObject 只是返回一个新的 SqlCeCommand 实例。 GetConnection 可以简单地返回一个新的 SqlCeConnection 实例。 DoneWithConnection 可能是一个 NOP。基本上,这些都是在处理 ORM 支持大量后备存储的事实。您需要的核心信息是我传入的 SQL 以及我如何确定 true/false 返回。

我(未在编译器中测试)对结果方法的猜测是这样的:

public bool TableExists(SqlCeConnection connection, string tableName)
{
using (var command = new SqlCeCommand())
{
command.Connection = connection;
var sql = string.Format(
"SELECT COUNT(*) FROM information_schema.tables WHERE table_name = '{0}'",
tableName);
command.CommandText = sql;
var count = Convert.ToInt32(command.ExecuteScalar());
return (count > 0);
}
}

关于c# - 如何以编程方式确定表是否存在于 SQL Server CE 数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com