sqldataparameter一般是用来传参数给sqlcommand的params,但sqlcommand不用sqldataparameter作为参数直接在sql语句中写什么insert into student values(name,gener),而不是写成含sqldataparameter形式insert into student values(@name,@gener);这两种都行吗?两种方法有什么区别,好处个在哪里。是不是存储过程只能用sqlparamter,而在文本中传参数两种都行。还有sqldataparameter中参数写到sql中一定要带@号吗?可以用什么方法改吗?有什么意见都提出来。。,好的就加分

解决方案 »

  1.   

    存储过程都用sqlparamter吧,我没见过用别的。存储过程都要带@的吧,指的是传参数啊!!这个与sqlparamter没有什么关系吧!1
      

  2.   

    下面这个插入函数就没用到sqlparamter,那怎么解释。人家参数怎么直接就可放在sql语句中吗?我也是纳闷,看人家传参都用sqlparamter,是不是那流行,感染了大家。
    存储过程都是用sqlparamter,但不用存储过程也很多人用sqlparamter。他好处在哪????
    /// <summary>
      /// 批量记录的插入操作,即可一次向多张表中插入不同的批量记录
      /// </summary>
      /// <param name="ds">批量记录组成的dataset,dataset中的各个datatable名为表名,各datatable中的datacolumn名为列名</param>
      public static void insertset(ref dataset ds)
      {
       factory factory = factory.getinstance();
       abstractdbfactory abstractdbfactory = factory.createinstance();
       idbconnection concretedbconn = abstractdbfactory.createconnection();
       concretedbconn.connectionstring = abstractdbfactory.getconnectionstring();   
       concretedbconn.open();
       idbcommand concretedbcommand = abstractdbfactory.createcommand();
       idbtransaction concretedbtrans = abstractdbfactory.createtransaction(concretedbconn);
       concretedbcommand.connection = concretedbconn;
       concretedbcommand.transaction = concretedbtrans;
       try
       {
        foreach(datatable dt in ds.tables)
        {
         foreach(datarow dr in dt.rows)
         {
          string strsql = "insert into " + dt.tablename + " (";
          for(int i = 0; i < dt.columns.count - 1; i++)
          {
           strsql += (dt.columns[i].caption + ", ");
          }
          strsql += (dt.columns[dt.columns.count - 1].caption + ") values ('");
          for(int i = 0; i < dt.columns.count - 1; i++)
          {
           strsql += (dr[i] + "', '");
          }
          strsql += (dr[dt.columns.count - 1] + "')");
          concretedbcommand.commandtext = strsql;
       concretedbcommand.executenonquery();
         }
        }
        concretedbtrans.commit();
       }
       catch
       {
        concretedbtrans.rollback();
        throw;
       }   finally
       {
        concretedbconn.close();
       }   
       concretedbcommand.executenonquery();
         }
        }
        concretedbtrans.commit();
       }
       catch
       {
        concretedbtrans.rollback();
        throw;
       }   finally
       {
        concretedbconn.close();
       }   
      

  3.   

    给存储过程传参数用的,当然,也可以用在一般的SqlCommand中,可以使SQL语句易读,增强可维护性.
      

  4.   

    两种都行.
    没有深入在性能和机制上研究过两种的优缺点.就普通的应用而言,有个人的习惯,一般如果是直接写SQL语句而不用存储过程的话,如果比较传统或者简单的SQL语句,那么一般是用传参的形式,讲究规范性,可读性以及可维护性,而且参数形式还可以自动匹配数据类型,在健壮性上也比较好.
    如果是要做SQL语句的拼接的话,那么不用参数直接拼接就显的更加方便和直观.
    这是我的使用习惯.
      

  5.   

    写SQL语句固然简单,但是对于企业级开发来说,一个相同功能的语句可能要反复调用,这时用存储过程有明显的优势,节省大量时间;
    对于@嘛,我至尽没看见过调用存储过程时不用的,因为他是个特殊符号,用来标记这个变量在存储过程中是一个参数变量,他在存储过程中是要声明
      

  6.   

    楼四的,能不能写一个SQL语句的拼接例子,能够体现个方面的。我给你加分。其实我觉得还是应该要sqlparamter,只是想了解下到底不要sqlparamter时,能不能传参数。我只是想确定下。只于,性能有没有那位大侠研究过,在这里讲讲,我也加分、
      

  7.   

    sqldataparameter一般是用来传参数给sqlcommand的params,但sqlcommand不用sqldataparameter作为参数直接在sql语句中写什么insert into student values(name,gener),而不是写成含sqldataparameter形式insert into student values(@name,@gener);这两种都行吗?
    -------------
    行.
    两种方法有什么区别,好处个在哪里。
    -------------
    写存储教程是写在数据库里.
    便于修改维护.
    如一个项目发布了,发现有一个sql语句错误.要是不是写在存储教程中.
    还得现到页面找,改后重新发布.
    如写在存储教程中,直接到数据库里面改就可以了.
    再有安全性好,防止sql注入.