gpt4 book ai didi

c# - 我的 SqlCommand 变量是否工作过度?它累了吗?

转载 作者:行者123 更新时间:2023-11-30 14:15:31 24 4
gpt4 key购买 nike

在我的测试项目中,我有一个名为 FixtureSetup 的静态类,我用它来设置我的集成测试数据以进行验证。

我在该类中使用相同的 SqlCommand 和 SqlParameter 变量(不是对象本身),反复使用相同的变量引用,每次都分配新的 SqlCommand 和 SqlParameter 对象。我的连接本身创建一次并传递给执行设置的方法,因此每个设置都使用它自己不同的连接引用,虽然多次使用相同的连接,但它始终以线性顺序排列。

在其中一种方法中,我遇到了一种非常奇怪的情况,我的 SqlCommand 变量似乎已经厌倦了。

        cmd = new SqlCommand("INSERT INTO Subscription (User_ID, Name, Active) VALUES (@User_ID, @Name, @Active)", conn);
parameter = new SqlParameter("@User_ID", TestUserID); cmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Name", "TestSubscription"); cmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Active", true); cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();

cmd = new SqlCommand("SELECT Subscription_ID FROM [Subscription] WHERE Name = 'TestSubscription'", conn);
parameter = new SqlParameter("@User_ID", TestUserID);
cmd.Parameters.Add(parameter);
using (dr = cmd.ExecuteReader())
{
while (dr.Read())
{
TestSubscriptionID = dr.GetInt32(dr.GetOrdinal("Subscription_ID"));
}
}

cmd = new SqlCommand("INSERT INTO SubscriptionCompany (Subscription_ID, Company_ID) VALUES (@Subscription_ID, @Company_ID)", conn);
parameter = new SqlParameter("@Subscription_ID", TestSubscriptionID); cmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Company_ID", KnownCompanyId); cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();

在上面显示的最后一行,做我在许多其他地方完全相同的事情(插入数据,读取 ID 列并捕获它),我得到以下内容:

SetUp : System.InvalidOperationException : ExecuteNonQuery requires an open and available Connection. The connection's current state is closed. at System.Data.SqlClient.SqlConnection.GetOpenConnection(String method)

但是 - 将 cmd 替换为新变量 myCmd,一切都会顺利进行!

        SqlCommand myCmd;
myCmd = new SqlCommand("INSERT INTO Subscription (User_ID, Name, Active) VALUES (@User_ID, @Name, @Active)", conn);
parameter = new SqlParameter("@User_ID", TestUserID); myCmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Name", "TestSubscription"); myCmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Active", true); myCmd.Parameters.Add(parameter);
myCmd.ExecuteNonQuery();

myCmd = new SqlCommand("SELECT Subscription_ID FROM [Subscription] WHERE Name = 'TestSubscription'", conn);
parameter = new SqlParameter("@User_ID", TestUserID);
myCmd.Parameters.Add(parameter);
using (dr = myCmd.ExecuteReader())
{
while (dr.Read())
{
TestSubscriptionID = dr.GetInt32(dr.GetOrdinal("Subscription_ID"));
}
}

myCmd = new SqlCommand("INSERT INTO SubscriptionCompany (Subscription_ID, Company_ID) VALUES (@Subscription_ID, @Company_ID)", conn);
parameter = new SqlParameter("@Subscription_ID", TestSubscriptionID); myCmd.Parameters.Add(parameter);
parameter = new SqlParameter("@Company_ID", KnownCompanyId); myCmd.Parameters.Add(parameter);
myCmd.ExecuteNonQuery();

这到底是怎么回事?我的命令 var 刚刚累了吗???

让我知道“修复”的是我在跟踪中注意到在我的“读取 id” block 中,我的 cmd.Parameters block 中只有一个参数,添加了第二个,当我强制第一个时cmd.Parameters.Add 行再次执行,列表中的参数数量下降到 0。这就是促使我尝试方法级别 SqlCommand 的原因...因为我有一个疯狂的想法,我的 cmd 很累...想象一下我的当我显然是对的时候感到震惊!

编辑:我在这里没有回收任何对象 - 只是变量引用本身(类级别的静态 SqlCommand)。对于之前我对问题措辞的混淆,我深表歉意。

最佳答案

每个查询使用一个命令并调用 dispose(或者更好的是,包装在 using 语句中)。您不想“重用”ado.net 组件。

关于c# - 我的 SqlCommand 变量是否工作过度?它累了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9879374/

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