加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-07-06 05:55:20 所属栏目:大数据 来源: https://blog.csdn.net/kasama1
导读:? 在ADO.NET中使用参数化SQL语句的大同小异 标签:?sqlstringsql servernullmysqlaccess 2008-03-19 01:26 ? 15067人阅读 ? 评论(17) ? 收藏 ? 举报 ? 分类: C#基础(110)? ? asp.net(103)? 版权声明:本文为博主原创文章,未经博主允许不得转载。 在ADO
?

在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一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读