none
关于SqlParameter的问题 C# RRS feed

  • 问题

  • 经常写数据访问层的时候,会写这些代码:

    string sql = @"UPDATE  dbo.Table1
                                    SET     ProductID = @ProductID ,
                                            YearNum = @YearNum ,
                                            Batch = @newBatch
                                    WHERE   BatchID = @originalBatch ";

                    SqlParameter[] parameters = {   new SqlParameter("@ProductID", productID), 
                                                    new SqlParameter("@YearNum", year), 
                                                    new SqlParameter("@newBatch", newBatch), 
                                                    new SqlParameter("@originalBatch", originalBatch) };
    代码中的 year 是DateTime类的,newBatch是字符串的,

    如果不用 SqlParameter的话, 手写sql语句的时候,都要给 日期和字符串加上 ' ' 两个冒号,如:

    string sql = @"UPDATE  dbo.Table1
    SET     YearNum = '2015-01-01'; ,
    Batch = 'a2015b1'

    我很好奇想知道, SqlCommand 是怎么根据SqlParameter去生产一段完整的sql命令的

    2015年1月5日 12:09

答案


  • Hello,

    如果是参数化查询的话,数据库不会直接执行你写的sql语句,而是通过调用sp_executesql 这个存储过程来执行你的sql语句,也就是说如果你写了如下的更新操作:

    SqlCommand cmd = new SqlCommand("update [Order] set OrderName = @OrderName", con);
    
                    cmd.Parameters.Add(new SqlParameter("@OrderName", "1"));
    
                    cmd.ExecuteNonQuery();
    

    你用sql profile 看到不会是:

    update [Order] set OrderName = '1'

    而应该是:

    exec sp_executesql N'update [Order] set OrderName = @OrderName',N'@OrderName nvarchar(1)',@OrderName=N'1'

    Regards.


    2015年1月6日 9:50
    版主