版权声明:本文为博主原创文章,未经博主允许不得转载。
在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
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
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的例子
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中存储过程(MysqL从5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化sql语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MysqL中参数化sql语句中要用“?”而不是和sql Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。