版权声明:本文为博主原创文章,未经博主允许不得转载。
在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驱动程序): @H_403_281@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中增加同样一条记录的代码如下: @H_403_281@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中增加同样一条记录的代码如下: @H_403_281@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中存储过程(MysqL从5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化sql语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MysqL中参数化sql语句中要用“?”而不是和sql Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。
总结以上是内存溢出为你收集整理的在ADO.NET中使用参数化SQL语句的大同小异全部内容,希望文章能够帮你解决在ADO.NET中使用参数化SQL语句的大同小异所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)