在ADO.NET中经常需要跟各种数据库打交道,在不实用存储过程的情况下,使用参数化SQL语句一定程度上可以防止SQL注入,同时对一些较难赋值的字段(如在SQL Server中Image字段,在Oracle中Clob字段等)使用参数化SQL语句很容易就能赋值,所以本人经常在ADO.NET中使用参数化SQL语句,近几年来陆续跟SQL Server/Oracle/MySQL/Access打交道,积累了一些心得,现在整理出来供大家参考。
我们假设数据可的结构如下图(设置的数据库为Oracle10g):
它在SQL Server中的创建语句是:
createtableS_Admin(
UserNamevarchar(60)notnull,
Passwordvarchar(60)notnull,
Remarkvarchar(50)null,
Mailvarchar(120)notnull,
AddDatedatetimenulldefaultGETDATE(),
LoginDatedatetimenulldefaultGETDATE(),
LoginIPvarchar(50)null,
Activesmallintnulldefault1,
LoginCountintnulldefault1,
Powerintnulldefault0,
Departidintnulldefault0,
constraintPK_S_ADMINprimarykeynonclustered(UserId)
)
go
下面假设数据库的主键都采用了数据库的本地化技术解决了(例如在Access、SQL Server和MySQL中采用自增字段,在Oracle中使用了sequence结合触发器),假如在Oracle中向表中插入一记录的代码如下:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Data.OracleClient;
///<summary>
///在Oracle中使用参数化SQL的例子
///代码编写:周公
///日期:2008-3-19
///发表网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///</summary>
publicclassOracleUtil
{
publicOracleUtil()
{
}
publicboolInsertAdmin(stringuserName,stringpassword,stringremark,stringmail,intdepartId,intpower)
{
stringsql="insertintoS_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(:UserName,:Password,:Remark,:Mail,:DepartId,:Power)";
OracleConnectionconnection=newOracleConnection();
connection.ConnectionString="";//此处设置链接字符串
OracleCommandcommand=newOracleCommand(sql,connection);
command.Parameters.Add(":UserName",OracleType.NVarChar,60).Value=userName;
command.Parameters.Add(":Password",OracleType.NVarChar,60).Value=password;
command.Parameters.Add(":Remark",OracleType.NVarChar,60).Value=remark;
command.Parameters.Add(":Mail",OracleType.NVarChar,60).Value=mail;
command.Parameters.Add(":DepartId",OracleType.Int32,4).Value=departId;
command.Parameters.Add(":Power",OracleType.Int32,4).Value=power;
connection.Open();
introwsAffected=command.ExecuteNonQuery();
connection.Close();
command.Dispose();
returnrowsAffected>0;
}
}
在MySQL中增加同样一条记录的代码如下(需要到MySQL官方网站下载.net驱动程序):
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingMySql.Data;
usingMySql.Data.MySqlClient;
///<summary>
///在MySQL中使用参数化SQL的例子
///代码编写:周公
///日期:2008-3-19
///发表网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///</summary>
publicclassMySqlUtil
{
publicMySqlUtil()
{
}
publicboolInsertAdmin(stringuserName,stringpassword,stringremark,stringmail,intdepartId,intpower)
{
stringsql="insertintoS_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(?UserName,?Password,?Remark,?Mail,?DepartId,?Power)";
MySqlConnectionconnection=newMySqlConnection();
connection.ConnectionString="";//此处设置链接字符串
MySqlCommandcommand=newMySqlCommand(sql,connection);
command.Parameters.Add("?UserName",MySqlDbType.VarChar,60).Value=userName;
command.Parameters.Add("?Password",MySqlDbType.VarChar,60).Value=password;
command.Parameters.Add("?Remark",MySqlDbType.VarChar,60).Value=remark;
command.Parameters.Add("?Mail",MySqlDbType.VarChar,60).Value=mail;
command.Parameters.Add("?DepartId",MySqlDbType.Int32,4).Value=departId;
command.Parameters.Add("?Power",MySqlDbType.Int32,4).Value=power;
connection.Open();
introwsAffected=command.ExecuteNonQuery();
connection.Close();
command.Dispose();
returnrowsAffected>0;
}
}
在SQL Server中增加同样一条记录的代码如下:
usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
///<summary>
///在SQLServer中使用参数化SQL的例子
///代码编写:周公
///日期:2008-3-19
///发表网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///</summary>
publicclassSqlUtil
{
publicSqlUtil()
{
}
publicboolInsertAdmin(stringuserName,stringpassword,stringremark,stringmail,intdepartId,intpower)
{
stringsql="insertintoS_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(@UserName,@Password,@Remark,@Mail,@DepartId,@Power)";
SqlConnectionconnection=newSqlConnection();
connection.ConnectionString="";//此处设置链接字符串
SqlCommandcommand=newSqlCommand(sql,connection);
command.Parameters.Add("@UserName",SqlDbType.NVarChar,60).Value=userName;
command.Parameters.Add("@Password",SqlDbType.NVarChar,60).Value=password;
command.Parameters.Add("@Remark",SqlDbType.NVarChar,60).Value=remark;
command.Parameters.Add("@Mail",SqlDbType.NVarChar,60).Value=mail;
command.Parameters.Add("@DepartId",SqlDbType.Int,4).Value=departId;
command.Parameters.Add("@Power",SqlDbType.Int,4).Value=power;
connection.Open();
introwsAffected=command.ExecuteNonQuery();
connection.Close();
command.Dispose();
returnrowsAffected>0;
}
}
在Access中增加同样一条记录的代码如下:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Data.OleDb;
///<summary>
///在Access中使用参数化SQL的例子
///代码编写:周公
///日期:2008-3-19
///发表网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/19/2195618.aspx
///</summary>
publicclassAccessUtil
{
publicAccessUtil()
{
}
publicboolInsertAdmin(stringuserName,stringpassword,stringremark,stringmail,intdepartId,intpower)
{
stringsql="insertintoS_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(?,?,?,?,?,?)";
OleDbConnectionconnection=newOleDbConnection();
connection.ConnectionString="";//此处设置链接字符串
//注意下面参数的顺序一定要按照sql语句中的插入的列的顺序赋值,否则一定会报异常
OleDbCommandcommand=newOleDbCommand(sql,connection);
command.Parameters.Add("?",OleDbType.LongVarWChar,60).Value=userName;
command.Parameters.Add("?",OleDbType.LongVarWChar,60).Value=password;
command.Parameters.Add("?",OleDbType.LongVarWChar,60).Value=remark;
command.Parameters.Add("?",OleDbType.LongVarWChar,60).Value=mail;
command.Parameters.Add("?",OleDbType.Integer,4).Value=departId;
command.Parameters.Add("?",OleDbType.Integer,4).Value=power;
connection.Open();
introwsAffected=command.ExecuteNonQuery();
connection.Close();
command.Dispose();
returnrowsAffected>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简单的参数化查询,操作的是oracle数据库!关于ado.net简单的参数化查询,操作的是oracle数据库!
ADO.NET中关于命令参数(SqlParameter)使用的一个完整示例,包中包括数据库,可直接运行使用。
数据ADO.NET sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较,主要比较了插入与读取的时间,读取里可以进行模糊检索
传智播客.Net精品就业班培训ADO.Net基础3:参数化SQL及案例
C#ADO.NET中如何在要执行的sql语句中使用变量
ADO.Net助手还可以用来以插入SQL语句形式导出导入记录,目前提供了插件还可以生成ADO.Net的C#数据库代码和上述支持的数据库Linq to Sql数据库代码,大大简化编写数据库代码复杂度和缩短了编写数据库代码时间。...
Ado.net自定义类MyDB连接SQL Server数据库,简单使用!
ADO.Net助手还可以用来以插入SQL语句形式导出导入记录,目前提供了插件还可以生成ADO.Net的C#数据库代码和上述支持的数据库Linq to Sql数据库代码,大大简化编写数据库代码复杂度和缩短了编写数据库代码时间。...
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
asp.net(C#)sql server数据库ado.net操作类SqlServerHelper
在ADO.NET 中使用XML 支持时,以下哪些建议是可取的? A. 从DataSet 读取XML 格式的数据 B. 使用XML 格式的数据填充DataSet C. 为DataSet 创建XML 格式的构架描述 D. 将数据以XML 格式保存在数据库中 正确答案...
学生管理系统源码,ADO.NET进行增删改查学生基本和系别信息,适合毕业设计。
数据适配器命令中的参数:描述适配器在运行时传递给 SQL 语句或存储过程的参数的结构和用途。 数据适配器中的表映射:描述如何在源表和数据集表之间映射列名的选项。 创建数据适配器:列出在 Visual Studio 中创建...
第12章+ADO.NET访问SQL Server 2008数据库.ppt
在《ADO.NET 4从入门到精通》的五大部分内容中,分别重点介绍了ADO.NET系统的不同侧面。具体包括基本概念、在分别采用内外数据源时如何使用这一技术、实体框架、linq和其他一些主题。本章主要面向ADO.NET技术的初学者...
简单的数据库连接,主要提供的ADO.NET在连接数据库(SQL SERVER)过程中要注意的事项和方法。内容简单易懂值得下载。
1、ExecuteNonQuery插入SQL数据 2、ExecuteScalar查询SQL语句 3、插入数据后,查询 ID,获得自增字段的值 4、ExecuteReader执行查询
ado.net中文手册ado.net中文手册
[第29讲:ADO.NET(玩SQL语句)(C#视频教程 + C#源代码).zip] 根据【田洪川 天轰穿 C#视频教程】的【第29讲:ADO.NET(玩SQL语句)】实现,VS2010编译运行正常;SQL Server数据库文件包括2005和2008两个版本的。 ...
ADO.NET 连接sql server数据库 ,采用app.config 外部配置数据库