Pac*_*cha 4 c# database ado.net
我试图从多个线程调用此方法,试图从相同的字符串中获取ID.我总是在创建SqlDataReader的行中获得此异常:
已经有一个与此命令关联的打开DataReader,必须先关闭它.
我不知道问题出在哪里.我正在使用lock()语句,所以我只使用一次命令,然后我处理它.有点新的数据库编程所以我不知道我的错误在哪里.
谢谢!
public int UsernameGetID(string username)
{
using (var command = new SqlCommand("SELECT user_id FROM " + ServerConstants.Database.TableUserInformation + " WHERE username = @Username", connection))
{
lock (command)
{
SqlParameter param = new SqlParameter("@Username", SqlDbType.VarChar, username.Length);
param.Value = username;
command.Parameters.Add(param);
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
return (int)reader[0];
}
else
{
// username doesn't exists
return 0;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
锁定command是没有意义的,因为你在方法中创建了一个新命令 - 没有其他代码可以锁定它.
但是,您正在共享多个命令之间的连接.不要这样做 - 在每次调用中创建一个新的SqlConnection(再次,在一个using语句中).不要担心效率方面 - 连接池将负责"真正的"网络连接.
所以你要:
using (var connection = new SqlConnection(...))
using (var command = new SqlCommand(..., connection))
{
connection.Open();
...
using (var reader = command.ExecuteReader())
{
return reader.Read() ? (int) reader[0] : 0;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |