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

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

概述在ADO.NET中使用参数化SQL语句大同小异标签: sqlstringsql servernullmysqlaccess2008-03-19 01:26 15067人阅读 评论(17) 收藏 举报 分类:C#基础(110)  asp.net(103) 版权声明:本文为博主原创文章,未经博主允许不得转载。在ADO.NET   在ADO.NET中使用参数化SQL语句的大同小异 标签: sqlstringsql servernullmysqlaccess 2008-03-19 01:26  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驱动程序):   @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中存储过程(MysqL5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化sql语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MysqL中参数化sql语句中要用“?而不是和sql Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。

总结

以上是内存溢出为你收集整理的在ADO.NET中使用参数化SQL语句的大同小异全部内容,希望文章能够帮你解决在ADO.NET中使用参数化SQL语句的大同小异所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存