【问题标题】:SQL SELECT With Stored Procedure and Parameters?带有存储过程和参数的 SQL SELECT?
【发布时间】:2012-01-12 17:58:21
【问题描述】:

我已经编写了很多基于存储过程的带有 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();
   }
}

【问题讨论】:

    标签: c# sql web-services sql-server-2008 web


    【解决方案1】:

    这是你出错的地方:

    cmd.ExecuteNonQuery();
    

    正在执行查询。

    您需要改为ExecuteReaderExecuteScalarExecuteReader 用于一个结果集(多行/多列),ExecuteScalar 当查询返回单个结果时(它返回object,因此需要将结果转换为正确的类型)。

    var result = (int)cmd.ExecuteScalar();
    

    results 变量现在将保存OledbDataReader 或带有SELECT 结果的值。您可以迭代结果(对于阅读器)或标量值(对于标量)。

    【讨论】:

    • 或者如果返回单行单列(如COUNT 这里):.ExecuteScalar()
    • @marc_s - 非常正确...在写完我的答案后才意识到。
    【解决方案2】:

    由于您只在单个值之后,您可以使用 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,您可以通过它逐行枚举结果集。

    【讨论】:

    • 获取必须声明标量变量“@userSID”时这样做..有什么想法吗?
    • 实际上我通过在 SQL 字符串中添加声明来解决这个问题。问题是它总是返回 0,但是当我在 SSMS 中运行它时它返回 3。要遵循的代码
    • 另外,“AD_SID”列的基础类型是什么?它是 GUID 吗?
    【解决方案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();
        }
    }
    

    【讨论】:

    • 获取必须声明标量变量“@userSID”时这样做..有什么想法吗?
    • cmd.Parameters.AddWithValue("userSID", userSID.ToString()); 是声明部分。你有没有在你的代码中添加它? userSID 列是什么类型的?
    • 它不是 SID,那时我会使用 uniqueidentifier 列。它是一个 Windows 安全标识符,也使用 TripleAES 加密
    • 我的答案代码应该可以工作。如果没有,我建议你问另一个问题来精确你得到的错误。我很难通过 cmets 了解现在什么不起作用:)
    【解决方案4】:

    cmd.executescalar 将返回单个值,例如您的计数。

    当您返回记录列表时,您将使用 cmd.executereader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多