【发布时间】:2011-07-24 21:00:37
【问题描述】:
我一直在尝试使用相同的 SqlConnection 和 SqlCommand 对象来执行不同的命令。
第一个检查重复,如果用户输入的数据不重复,第二个插入数据。
这是我的代码示例:
using (SqlConnection conn = new SqlConnection(ConnStr))
{
string Command = "SELECT CountryName FROM [Countries] WHERE CountryName = @Name";
using (SqlCommand comm = new SqlCommand(Command, conn))
{
comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20);
comm.Parameters["@Name"].Value = Name;
comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
comm.Parameters["@IsVisible"].Value = IsVisible;
conn.Open();
if (comm.ExecuteScalar() == null)
{
Command = "INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible);";
comm.ExecuteNonQuery();
}
}
我试图通过使用一个连接来保存对数据库的访问。
问题是:
第一个命令运行正常,但是 第二个命令插入 数据库不起作用(它不添加 数据库的任何记录),当我 试图显示影响它的行 给了我-1!!
问题是:
这是检查的理想方法吗? 约束 a 的重复记录 独特的国家?以及为什么第二个 命令没有执行?
【问题讨论】:
-
您不需要明确需要使用相同的数据库连接来保存到数据库的行程,因为connection pooling 几乎肯定会被使用(除非您已经明确禁用它)。如果执行两次(使用或不使用相同的连接),将会有两次调用 DB。
-
感谢您的提示 +1 .. 但在您看来,在我的情况下,您是否认为有一种方法可以减少 Db 的负载?
-
如果您使用存储过程,绝对可以。这会是一个选择吗?
-
@IKashef:我的回答中描述的方式(在列上放置数据库约束并在重复的情况下处理抛出的异常)只需要一次访问数据库。
-
@steinar,这是一个选项,但您有存储过程的代码吗? ..我的意思是我尝试选择后如何检查名称是否存在!?