none
三层出现问题了,请老师们看看 RRS feed

  • 问题

  •   是这样的,我原来在做java 目前学习的三层跟java 的Dao模式基本一样,我找了份源码,照葫芦画瓢的模拟了一份,但我运行不了

    一下是代码 请老师们帮我看下!!!

    DAL层

    namespace DAL
    {
    public class testsql
    {

    public int add_admin(test tet)
    {
    SQLHelper.SQLHelper sqlhelpter = new SQLHelper.SQLHelper();

    SqlParameter[] parmlist ={
    sqlhelpter.CreateInParam("@names",SqlDbType.NVarChar,20,tet.Names),
    sqlhelpter.CreateInParam("@xueli",SqlDbType.NVarChar,5,tet.Xueli)

    };
    try
    {
    return (sqlhelpter.RunProc("test", parmlist));

    }
    catch(Exception ex)
    {
    throw new Exception(ex.Message, ex);
    }
    }
    }
    }

    SQLheltepl层
    		public void RunProc(string procName, out SqlDataReader dataReader) 
    {
    ///创建Command
    SqlCommand cmd = CreateProcCommand(procName, null);

    try
    {
    ///读取数据
    dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch(Exception ex)
    {
    dataReader = null;
    ///记录错误日志
    SystemError.CreateErrorLog(ex.Message);
    }
    }
    还是sqlHelptel层
    掉用
    CreateProcCommand

    		private SqlCommand CreateProcCommand(string procName, SqlParameter[] prams) 
    {
    ///打开数据库连接
    Open();

    ///设置Command
    SqlCommand cmd = new SqlCommand(procName, myConnection);
    cmd.CommandType = CommandType.StoredProcedure;

    ///添加把存储过程的参数
    if (prams != null)
    {
    foreach (SqlParameter parameter in prams)
    {
    cmd.Parameters.Add(parameter);
    }
    }

    ///添加返回参数ReturnValue
    cmd.Parameters.Add(
    new SqlParameter(RETURNVALUE, SqlDbType.Int,4,ParameterDirection.ReturnValue,
    false,0,0,string.Empty, DataRowVersion.Default,null));

    ///返回创建的SqlCommand对象
    return cmd;
    }

    然后是打开数据库的方法

    		private void Open() 
    {
    // 打开数据库连接
    if (myConnection == null)
    {
    myConnection = new SqlConnection(ConfigurationManager.AppSettings["SQLCONNECTIONSTRING"].ToString());
    }
    if(myConnection.State == ConnectionState.Closed)
    {
    try
    {
    ///打开数据库连接
    myConnection.Open();
    }
    catch(Exception ex)
    {
    SystemError.CreateErrorLog(ex.Message);
    }
    finally
    {
    ///关闭已经打开的数据库连接
    }
    }
    }
    以下是我的存储过程

    ALTER PROCEDURE [dbo].[test]
    (
    @names VARCHAR(20),
    @xueli VARCHAR(5)
    )
    AS
    INSERT INTO ta1
    (
    names,
    xueli
    )
    VALUES
    (
    @names,
    @xueli
    )
    RETURN @@Identity

    以下是异常信息:
    未将对象引用设置到对象的实例。 body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }

    未将对象引用设置到对象的实例。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    源错误:

    行 127:			
    行 128:			///返回存储过程的参数值
    行 129:			return (int)cmd.Parameters[RETURNVALUE].Value;
    
    行 130:		}
    行 131:



    2009年5月22日 9:01

答案

  • 原因是存储过程中参数 RETURNVALUE 没有返回值为 NULL, 不过我看你的样子,好像不需要 RETURNVALUE ,
    如果不需要可以注释掉所有的关于 参数 RETURNVALUE 的声明,
    如果需要你可以在存储过程中添加 set @RETURNVALUE = 1;
    或者 return (int)cmd.Parameters[RETURNVALUE].Value; 改为
    object o = cmd.Parameters[RETURNVALUE].Value;
    if (o == DbNull.Value)
        return 0;
    else
        return (int)o;

    	


    知识改变命运,奋斗成就人生!
    2009年5月22日 9:11
    版主