微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ADO.NET中使用参数化SQL语句的大同小异

 

在ADO.NET中使用参数化SQL语句的大同小异

标签: sqlstringsql servernullmysqlaccess
  15067人阅读  评论(17)  收藏  举报

  分类
 

在ADO.NET中经常需要跟各种数据库打交道,在不实用存储过程的情况下,使用参数化sql语句一定程度上可以防止sql注入,同时对一些较难赋值的字段(如在sql Server中Image字段,在Oracle中Clob字段等)使用参数化sql语句很容易就能赋值,所以本人经常在ADO.NET中使用参数化sql语句,近几年来陆续跟sql Server/Oracle/ MySQL/Access打交道,积累了一些心得,现在整理出来供大家参考。

我们假设数据可的结构如下图(设置的数据库为Oracle10g):


它在sql Server中的创建语句是:
 

create  table S_Admin (
   UserName              varchar( 60)           not  null,
   Password              varchar( varchar( 50)           varchar( 120)          datetime              null  default  GETDATE(),
   LoginDate             datetime              varchar( smallint              default  1,
   LoginCount            int                   Power                 int                   0,
   Departid              int                   constraint PK_S_ADMIN  primary  key  nonclustered (UserId)
)
go

 

下面假设数据库的主键都采用了数据库的本地化技术解决了(例如在Access、sql Server和MysqL中采用自增字段,在Oracle中使用了sequence结合触发器),假如在Oracle中向表中插入一记录的代码如下:
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;

///   <summary>
 在Oracle中使用参数化sql的例子
 代码编写:周公
 日期:2008-3-19
 发表网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///
</summary>
public  class OracleUtil
{
     public OracleUtil()
    {
        
    }

     bool InsertAdmin( string userName,  string password,255)">string remark,255)">string mail,255)">int departId,255)">int power)
    {
         string sql = "insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(:UserName,:Password,:Remark,:Mail,:DepartId,:Power)";
        OracleConnection connection =  new OracleConnection();
        connection.ConnectionString = ""; // 此处设置链接字符串
        OracleCommand command =  new OracleCommand(sql, connection);
        command.Parameters.Add(":UserName", OracleType.NVarChar, 60).Value = userName;
        command.Parameters.Add(":Password", 60).Value =password;
        command.Parameters.Add(":Remark", 60).Value = remark;
        command.Parameters.Add(":Mail", 60).Value =mail;
        command.Parameters.Add(":DepartId", OracleType.Int32, 4).Value =departId;
        command.Parameters.Add(":Power", 4).Value = power;
        connection.open();
         int rowsAffected=command.ExecuteNonQuery();
        connection.Close();
        command.dispose();
         return rowsAffected > 0;
    }
}
MysqL增加同样一条记录的代码如下(需要到MysqL官方网站下载.net驱动程序):
 
using MysqL.Data;
using MysqL.Data.MysqLClient;

 在MysqL中使用参数化sql的例子
 发表网址: http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///
class MysqLUtil
{
     public MysqLUtil()
    {
        
    }

             MysqLConnection connection =  new MysqLConnection();
        connection.ConnectionString = "";
        MysqLCommand command =  new MysqLCommand(sql, connection);
        command.Parameters.Add("?UserName", MysqLDbType.VarChar, 60).Value = userName;
        command.Parameters.Add("?Password", 60).Value = password;
        command.Parameters.Add("?Remark", 60).Value = remark;
        command.Parameters.Add("?Mail", 60).Value = mail;
        command.Parameters.Add("?DepartId", MysqLDbType.Int32, 4).Value = departId;
        command.Parameters.Add("?Power",255)">int
 rowsAffected = command.ExecuteNonQuery();
        connection.Close();
        command.dispose();
         return rowsAffected > 0;
    }
}
sql Server中增加同样一条记录的代码如下:
 
using System.Data.sqlClient;
using System.Web.UI.HtmlControls;

 在sql Server中使用参数化sql的例子
class sqlUtil
{
     public sqlUtil()
    {
        
    }

             sqlConnection connection =  new sqlConnection();
        connection.ConnectionString = "";
        sqlCommand command =  new sqlCommand(sql, connection);
        command.Parameters.Add("@UserName",sqlDbType.NVarChar, 60).Value = userName;
        command.Parameters.Add("@Password", sqlDbType.NVarChar, 60).Value = password;
        command.Parameters.Add("@Remark", 60).Value = remark;
        command.Parameters.Add("@Mail", 60).Value = mail;
        command.Parameters.Add("@DepartId", sqlDbType.Int, 4).Value = departId;
        command.Parameters.Add("@Power",255)">return
 rowsAffected > 0;
    }
}
在Access中增加同样一条记录的代码如下:
 
using System.Data.OleDb;

 在Access中使用参数化sql的例子
http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx class AccessUtil
{
     public AccessUtil()
    {
        
    }

             OleDbConnection connection =  new OleDbConnection();
        connection.ConnectionString = ""; 此处设置链接字符串
        
注意下面参数的顺序一定要按照sql语句中的插入的列的顺序赋值,否则一定会报异常
        OleDbCommand command =  new OleDbCommand(sql, connection);
        command.Parameters.Add("?", OleDbType.LongVarWChar, 60).Value = userName;
        command.Parameters.Add("?", 60).Value = password;
        command.Parameters.Add("?", 60).Value = remark;
        command.Parameters.Add("?", 60).Value = mail;
        command.Parameters.Add("?", OleDbType.Integer, 4).Value = departId;
        command.Parameters.Add("?",255)">return
 rowsAffected > 0;
    }
}
需要说明的是,除了Access之外,操作其它数据库可以不必要按照参数在sql语句中出现的顺序添加进去一样可以正确执行,但是在Access中一定按照插入的列的顺序添加参数,因为“OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的定位参数,而不使用命名参数(MSDN)”,所以给添加参数和赋值一定要按照列的顺序。

通过上面的例子,基本上可以总结出一个规律:在参数化sql中参数名的格式跟其在存储过程中生命存储过程参数一致,例如在Oracle中存储过程参数一律以”:”开头,在MS sql Server中存储过程参数一律以”@”开头,而在MysqL中存储过程(MysqL5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化sql语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MysqL中参数化sql语句中要用“?而不是和sql Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐