我一直在编写大量基于存储过程的SQL插入的Web服务,而且我还没有真正使用任何SELECTS。
我想到的SELECT
非常简单。
SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization
WHERE AD_SID = @userSID
但是,根据我当前的INSERT
代码,我无法弄清楚如何将其变为SELECT
并返回ReturnCount
的值...你能帮忙吗?这是我的INSERT
代码:
string ConnString = "Data Source=Removed";
string SqlString = "spInsertProgress";
using (OleDbConnection conn = new OleDbConnection(ConnString))
{
using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("attachment_guid", smGuid.ToString());
cmd.Parameters.AddWithValue("attachment_percentcomplete", fileProgress);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
答案 0 :(得分:6)
这是你出错的地方:
cmd.ExecuteNonQuery();
您 正在执行查询。
您需要ExecuteReader
或ExecuteScalar
。 ExecuteReader
用于结果集(多行/列),ExecuteScalar
当查询返回单个结果时(它返回object
),因此需要将结果强制转换为正确的类型)。
var result = (int)cmd.ExecuteScalar();
results
变量现在将包含OledbDataReader
或包含SELECT
结果的值。您可以迭代结果(对于读者)或标量值(对于标量)。
答案 1 :(得分:4)
由于您只使用单个值,因此可以使用cmd.ExecuteScalar();
完整的例子如下:
string ConnString = "Data Source=Removed";
string userSid = "SomeSid";
string SqlString = "SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization WHERE AD_SID = @userSID;";
int returnCount = 0;
using (OleDbConnection conn = new OleDbConnection(ConnString))
{
using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@userSID", userSid);
conn.Open();
returnCount = Convert.ToInt32(cmd.ExecuteScalar());
}
}
如果要返回MULTIPLE行,可以使用ExecuteReader()方法。这将返回一个IDataReader,您可以通过它逐行枚举结果集。
答案 2 :(得分:3)
您需要使用ExecuteScalar
代替ExecuteNonQuery
:
String query = "SELECT COUNT(AD_SID) As ReturnCount FROM AD_Authorization WHERE AD_SID = @userSID ";
using (OleDbConnection conn = new OleDbConnection(ConnString)) {
using (OleDbCommand cmd = new OleDbCommand(query, conn))
{
cmd.Parameters.AddWithValue("userSID", userSID.ToString());
conn.Open();
int returnCount = (Int32) cmd.ExecuteScalar();
conn.Close();
}
}
答案 3 :(得分:0)
cmd.executescalar将返回单个值,例如您的计数。
当您返回记录列表时,您将使用cmd.executereader