gkwww(奔放) 说的很对,
CREATE PROC sp_TDataRowLockerSave
@n_DataRowID NUMERIC(10,0) ,
@s_TableName NVARCHAR(50),
@s_Locker NVARCHAR(10),
@Locker NVARCHAR(10) OUTPUT,
@j VARCHAR(2) OUTPUT
...C#中:
...
SqlCommand cmd = new SqlCommand("sp_TDataRowLockerSave",conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Clear(); SqlParameter param = new SqlParameter("@n_DataRowID",SqlDbType.Decimal);
param.Value = n_DataRowID;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param); param = new SqlParameter("@s_TableName",SqlDbType.NVarChar,50);
param.Value = s_TableName;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param); param = new SqlParameter("@s_Locker",SqlDbType.NVarChar,10);
param.Direction = ParameterDirection.Input;
param.Value = s_Locker;
cmd.Parameters.Add(param); param = new SqlParameter("@Locker",SqlDbType.NVarChar,10);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param); param = new SqlParameter("@j",SqlDbType.NVarChar,2);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); string locker = cmd.Parameters["@Locker"].Value.ToString();
string str = cmd.Parameters["@j"].Value.ToString();...

解决方案 »

  1.   

    贴出你的存储过程和传给它的参数,你也可以通过SQL事件察看器看看到底传了什么给该存储过程
      

  2.   

    我的代码如下,请帮我看看到底哪里错误????下面是我的存储过程的参数定义部分:
    ALTER PROCEDURE dbo.AttendanceAuto (
    @CardNo nvarchar(20),
    @MinutesOffset int=0,
    @AttendanceResult int=0 output,
    @EmployeeID nvarchar(20) output,
    @EmployeeName nvarchar(20) output


    )
    AS下面是程序部分:SqlCommand sqlComm = new SqlCommand();
    sqlComm.CommandType = CommandType.StoredProcedure;
    sqlComm.CommandText = "AttendanceAuto";
    sqlComm.Parameters.Clear();sqlComm.Parameters.Add("@CardNo",DbType.String);
    sqlComm.Parameters["@CardNo"].Value = CardNo ;sqlComm.Parameters.Add("@MinutesOffset",DbType.Int32);
    sqlComm.Parameters["@MinutesOffset"].Value = 0;sqlComm.Parameters.Add("@AttendanceResult",DbType.Int32);
    sqlComm.Parameters["@AttendanceResult"].Direction = ParameterDirection.Output;sqlComm.Parameters.Add("@EmployeeID",DbType.String);
    sqlComm.Parameters["@EmployeeID"].Direction = ParameterDirection.Output;sqlComm.Parameters.Add("@EmployeeName",DbType.String);
    sqlComm.Parameters["@EmployeeName"].Direction = ParameterDirection.Output;

    sqlComm.ExecuteNonQuery();int AttendanceResult = (int) sqlComm.Parameters["@AttendanceResult"].Value;
    string EmployeeID = sqlComm.Parameters["@EmployeeID"].Value.ToString();
    string EmployeeName = sqlComm.Parameters["@EmployeeName"].Value.ToString();
      

  3.   

    存储过程本身执行是没有问题的,用事件探查器看到的结果是:exec sp_reset_connection
      

  4.   

    事件探查器会有AttendanceAuto 的,你再看看
    然后复制下来到查询分析器里执行以下看看到底问题出在哪儿
      

  5.   

    Q: 怎样写一个存储过程类来实现C#中对存储过程的调用?A: 假设数据表为UserDataStore,存储过程InsertUserData如下:CREATE PROCEDURE InsertUserData 
    @UserName NVARCHAR(50) = NULL, 
    @UserInfo NVARCHAR(4000) = NULL AS 
    SET XACT_ABORT ON 
    BEGIN TRANSACTION 
    INSERT INTO [UserDataStore] 
    VALUES (@UserName,@UserInfo) 
    COMMIT TRANSACTION 
    RETURN 0 
    GO
    则相应的程序为:... 
    public bool InsertUserData(DataSet userData) 

    OleDbCommand insertCommand=new OleDbCommand("InsertUserData",dsConnection); 
    insertCommand.CommandType=CommandType.StoredProcedure; 
    insertCommand.Parameters.Add("@UserName",OleDbType.VarWChar,50,"UserName"); 
    insertCommand.Parameters.Add("@UserInfo", OleDbType.VarWChar,4000,"UserInfo"); 
    dsCommand.InsertCommand=insertCommand; 
    try 

    dsCommand.InsertCommand=this.GetInsertCommand(); 
    dsCommand.Update(userData,"UserDataStore"); 
    userData.AcceptChanges(); 
    return (true); 

    catch(Exception e) 

    throw e; 

    }