用C#写的存储过程用于登录校验及写入登录信息用。
单独测试是可以得到userId的,但用程序调用userId始终为-1,即oID始终为null且Insert登录信息操作未执行。
不知是什么原因?另外,哪里有C#写存储过程的高级例子,很想学习学习。
    [SqlProcedure]
    public static void Login(string userName, string password, int loginMode, out int userId)
    {
        userId = -1;
        SqlConnection conn = new SqlConnection("context connection=true");
        string strSql = string.Format("SELECT ID FROM Users WHERE Name = '{0}' AND Password = '{1}'", userName, password);
        SqlCommand sqlCmd = new SqlCommand();
        sqlCmd.CommandText = strSql;
        sqlCmd.Connection = conn;
        conn.Open();
        object oID = sqlCmd.ExecuteScalar();
        conn.Close();
        if (oID != null)
        {
            userId = (int)oID;
            strSql = string.Format("INSERT INTO UserLogin (UserID, Mode) Values({0}, {1})", userId, loginMode);
            sqlCmd.CommandText = strSql;
            conn.Open();
            sqlCmd.ExecuteNonQuery();
        }
        if (conn.State == ConnectionState.Open) conn.Close();
    }

解决方案 »

  1.   

    我晕,这是什么高级例子?SP对吗?
    里面要有RETURN 的语句才能有返回值。给你一个抓参数的真正例子:                LocalDBConn cnn = new WSC.Common.LocalDBConn();
                    SqlParameter[] paras = new SqlParameter[1];
                    SqlParameter para = new SqlParameter("@path", System.Data.SqlDbType.NVarChar, 1000);
                    para.Direction = ParameterDirection.Output;
                    paras[0] = para;
                    SqlCommand cmd = cnn.CreateStoreProcedureCommand("GetWebPath", paras);                
                    cmd.ExecuteNonQuery();                string strPath = cmd.Parameters["@Path"].Value.ToString(); //这里才抓OUT参数
      

  2.   

    Hi,大飞飞同志。我贴的是C#写的存储过程而不是调用存储过程,输出参数就是userId.
    关于调用存储过程就是类似你的写法,但out参数始终是-1.
      

  3.   

    参看
    http://blog.csdn.net/knight94/archive/2006/03/23/635885.aspx这里面的存储以及存储调用
      

  4.   

    Knight94(愚翁):那个帖子是用T-SQL写的存储过程,我现在用的是C#写的存储过程,现在的问题是调用后,输出参数(userId)始终为-1,即object oID = sqlCmd.ExecuteScalar();语句执行后oID为null,不知为何!
      

  5.   

    没有符合条件的记录,因此返回null
      

  6.   

    调用都是符合条件的。用test.sql测试是有输出结果的,但在程序中调用就得不到out参数,是不是调用还有什么要求?
      

  7.   

    看这个分页的例子,
    http://blog.csdn.net/zhzuo/archive/2004/10/28/156647.aspx
      

  8.   

    /// <summary>
    /// 存储过程执行函数
    /// </summary>
    /// <param name="strSpName">存储过程名</param>
    /// <param name="ht">参数信息集</param>
    /// <param name="strParameterArray">需返回的参数名数组</param>
    /// <returns>存有返回值的HashTable</returns>
    public void ExecStoredProcedure(string strSpName,Hashtable ht,string[] strParameterArray)
    {
    SqlCommand comm = new SqlCommand(strSpName,Conn);
    comm.CommandType = CommandType.StoredProcedure; IDictionaryEnumerator htEnumerator = ht.GetEnumerator();
    while (htEnumerator.MoveNext())
    comm.Parameters.Add(htEnumerator.Key.ToString(),htEnumerator.Value); foreach (string strParameterName in strParameterArray)
    comm.Parameters[strParameterName].Direction = ParameterDirection.Output; try
    {
    OpenConn();
    comm.ExecuteNonQuery();
    }
    finally
    {
    CloseConn();
    }

    ht.Clear();
    foreach (string strParameterName in strParameterArray)
    ht.Add(strParameterName,comm.Parameters[strParameterName].Value);
    } /// <summary>
    /// 存储过程执行函数
    /// </summary>
    /// <param name="strSpName">存储过程名</param>
    /// <param name="ht">参数信息集</param>
    public void ExecStoredProcedure(string strSpName,Hashtable ht)
    {
    SqlCommand comm = new SqlCommand(strSpName,Conn);
    comm.CommandType = CommandType.StoredProcedure; IDictionaryEnumerator htEnumerator = ht.GetEnumerator();
    while (htEnumerator.MoveNext())
    comm.Parameters.Add(htEnumerator.Key.ToString(),htEnumerator.Value); try
    {
    OpenConn();
    comm.ExecuteNonQuery();
    }
    finally
    {
    CloseConn();
    }
    } Hashtable ht = new Hashtable();
    ht.Add("@variable_1","参数1");
    ht.Add("@variable_2","参数2");
    ht.Add("@variable_3","参数3");
    //带返回数据
    string[] variableList = {"@variable_2","@variable_3"};
    ExecStoredProcedure("存储过程名",Hashtable ht,variableList);
    //返回数据在Hashtable ht相对应的键中 //不带返回数据
    ExecStoredProcedure("存储过程名",Hashtable ht); //ExecStoredProcedure方法是一个2次重载的方法
      

  9.   

    我刚刚也碰到这样的问题,看楼主的帖,楼主帮我解决了连接的问题,我现在帮楼主解决输出 的问题:using System.Data;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;public partial class StoredProcedures {
        [Microsoft.SqlServer.Server.SqlProcedure()]
        public static void SampleSP(string connstring, out int spid) {
            using (SqlConnection conn = new SqlConnection(connstring)) {
                conn.Open();            SqlCommand cmd = new SqlCommand("SELECT @@SPID", conn);
                spid = (int)cmd.ExecuteScalar();
            }
        }
    }
    --注意这里,out int spid,代表输出参数
      

  10.   

    SqlContext.Pipe.ExecuteAndSend(cmd);--问题解决
      

  11.   

    参考,
    http://blog.csdn.net/zhzuo/archive/2004/10/28/156647.aspx
      

  12.   

    http://topic.csdn.net/u/20100601/17/b1769e14-60d9-41c6-b6e4-30960aa75a50.html
    参考