为什么SQL连接会留下参数?

发布于 2024-09-02 01:20:39 字数 317 浏览 3 评论 0原文

每次使用 sqlite 进行编码时,我总是有确切数量的参数,并且当我执行查询时,后面总是有 0 个参数。我一直使用 cmd 对象,它工作得很好。

现在,在移植到使用 sql server (2008) 时,我的 SqlConnection 具有成功命令留下的参数。为什么?我似乎能够创建没有问题的表(然后我可能再次使用空cmd的克隆,因为我使用递归)。 SqlCommand 是否总是在查询后保留参数?除非我执行parameter.clear(),否则这总是会破坏以下查询。

我应该创建一个新的 SqlCommand 对象吗?或者每次都使用parameter.clear()?我有点困惑。

While coding with sqlite everytime i always had the exact number of parameters and when i executed the query i always had 0 parameters after it. I kept using the cmd object and it worked fine.

Now while porting to use sql server (2008) my SqlConnection has parameters left over from a successful command. Why? I seem to be able to create tables without the problem (then again i may have use a clone of an empty cmd since i use recursion). Does SqlCommand always leave the parameters in after a query? This always breaks the following query unless i do parameter.clear().

Should i create a new SqlCommand object? or use parameter.clear() each time? I'm somewhat confused.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

在风中等你 2024-09-09 01:20:39

当然,它会把那些留在那儿——你从来没有告诉过它。

如果您需要连续调用同一个 SqlCommand 数百次该怎么办 - 您想在每次调用后继续重新创建所有参数吗?对我来说没有多大意义......

我的建议:对每个要执行的“命令”或“查询”使用一个 SqlCommand 并根据需要设置其参数。我不会为十几个不同的查询“回收”单个 SqlCommand...只需创建一个新的!这绝对不是一个昂贵的手术。

Sure it leaves those there - you never told it otherwise.

What if you need to call the same SqlCommand hundreds of times in a row - do you want to keep re-creating all the parameters after each call?? Doesn't make a lot of sense to me....

My advice: use one SqlCommand per "command" or "query" you want to execute and set up its parameters as needed. I wouldn't "recycle" a single SqlCommand for a dozen different queries... just create a new one! That's definitely not an expensive operation.

酒解孤独 2024-09-09 01:20:39

我想这取决于提供者每次执行命令时是否清除参数列表。就我个人而言,我认为 SqlCommand 方式更有意义,因为这样我就可以做这样的事情:

var cmd = new SqlCommand("SomeSprocName", ...);
cmd.Parameters.Add("@param1", SqlDbType.NVarChar).Value = "some string";
cmd.Parameters.Add("@param2", SqlDbType.Int);

for(int i = 0; i < 10; i++)
{
    cmd.Parameters["@param2"].Value = i;
    cmd.ExecuteNonQuery();
}

也就是说,我可以在循环中一遍又一遍地执行相同的命令,只需更改参数实际上是不同的。

如果您正在执行完全不同的命令,那么我想说创建命令对象的另一个实例可能是有意义的。调用 cmd.Parameters.Clear() 并重新添加新参数不会有什么坏处,但命令对象上还有其他属性可能会影响执行(例如CommandTypeCommandTimeout等),如果您正在执行一个全新的命令,那么从头开始更有意义。

I guess it's up to the provider whether or not it clears the parameter list each time you execute the command. Personally, I think the SqlCommand way makes more sense, because then I can do something like this:

var cmd = new SqlCommand("SomeSprocName", ...);
cmd.Parameters.Add("@param1", SqlDbType.NVarChar).Value = "some string";
cmd.Parameters.Add("@param2", SqlDbType.Int);

for(int i = 0; i < 10; i++)
{
    cmd.Parameters["@param2"].Value = i;
    cmd.ExecuteNonQuery();
}

That is, I can execute the same command over-and-over in a loop and only have to change the parameters that are actually different.

If you're executing a totally different command, then I would say it probably makes sense to just create another instance of the command object. It wouldn't hurt to call cmd.Parameters.Clear() and re-add the new parameters, but there are other properties on the command object that can affect the execution (e.g. CommandType, CommandTimeout, etc) and if you're executing a whole new command, it makes more sense to start from scratch.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文