以下代码是否使用了良好做法?我想做的就是得到任何给定用户拥有的行数:
objSQLCommand = New SqlCommand("select count(id) as record_count from table1 where user = @strUser", objSQLConnection)
objSQLCommand.Parameters.Add("@strUser", SqlDbType.VarChar, 3).Value = strUser
objSQLCommand.Connection.Open()
objSQLDataReader = objSQLCommand.ExecuteReader()
objSQLDataReader.Read()
intRecordCount = objSQLDataReader("record_count")
objSQLDataReader.Close()
objSQLCommand.Connection.Close()
答案 0 :(得分:3)
我建议:
将命令转换为存储的命令 过程
让SP将计数作为其返回 仅输出
然后使用ExecuteScalar(不需要a 读取器)
围绕连接使用环绕 命令妥善处理。
答案 1 :(得分:2)
由于您返回的是单个值,因此您只能使用ExecuteScalar而不是阅读器。
参见示例here。
答案 2 :(得分:2)
为什么不使用LINQ to Entities?你的代码有时间扭曲感......
答案 3 :(得分:1)
根据@amelvin和@ChrisW的说法,这并不是一种糟糕的做法。和...
你可以在存储过程中包装你的sql查询,只有两行是不同的:
objSQLCommand = New SqlCommand("GetCountByUser", objSQLConnection);
objSQLCommand.CommandType = CommandType.StoredProcedure;
在设计说明中,您可以将用户引用保留为ID,而不是每行使用VarChar:
IE
<强> UsersTable 强>
ID名称电子邮件
1 Oshirowanen Oshirowanen@hotmail.com
2 5arx 5arx@test.com
3 JeffA jeffattwood@stackexchange.com
<强> RecordTable 强>
ID用户名OtherColumns
1234 1 Oshirenin 1
1235 1 Oshirenin 2
1236 2 5arx的专栏#1
1237 3杰夫阿特伍德来到这里
1238 2另一个5arx专栏
因此,您可以使用用户的数字ID调用(在存储过程或内联SQL中)。这种方法可以阻止您在记录表的每一行中复制用户名。