`
android_mylove
  • 浏览: 380574 次
社区版块
存档分类
最新评论

C# 中SqlParameter类的使用方法小结

 
阅读更多

C# SqlParameter类的使用方法小结

c#中执行sql语句时传递参数的小经验

1、直接写入法:

例如:

int Id =1;

string Name="lui";

cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')";

因为Id是数值,所以在传递的时候只需要在sql字符串中用"+Id+"即可实现,而 Name是字符串,所以在传递的时候还需要在"+Name+"两边各加一个单引号(')来 实现;

2、给命令对象添加参数法:

例如:

int Id =1;

string Name="lui";

cmd.CommandText="insert into TUserLogin values(@Id,@Name)";

//上条语句中直接在sql语句中写添加的参数名,不论参数类型都是如此.

SqlParameter para=new SqlParameter("@Id",SqlDbType.int,4);//生成一个名字为@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同

para.Value=Id;//给参数赋值

cmd.Parameters.Add(para);//必须把参数变量添加到命令对象中去。

//以下类似

para=new SqlParameter("@Name",SqlDbType.VarChar,16);

para.Value=Name;

com.Parameters.Add(para);

...然后就可以执行数据库操作了。

声明:本帖转自 http://www.knowsky.com/339188.html

在此对本帖原创作者,致以最诚挚的谢意!

=============================================

SqlParameter用法

SqlParameter[] parameters = { new SqlParameter("@a", "a1"), new SqlParameter("@b", "b1") };

string strReturn = "";

StringBuilder strBulResult = new StringBuilder();

foreach (SqlParameter parameter in parameters)

{

strBulResult.Append(parameter.ParameterName);

strBulResult.Append(":");

strBulResult.Append(parameter.SqlValue);

strBulResult.Append("/n");

}

strReturn = strBulResult.ToString();

声明:本帖转自 http://hi.baidu.com/daxiongmao_adi/blog/item/d7ac6ccdd75348540eb34553.html

在此对本帖原创作者,致以最诚挚的谢意!

=============================================

SqlParameter用法

关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--

单引号而截断字符串,“or 1=1的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

简单的给个示例

传统的查询语句的sql可能为

string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";

很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);

SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);

_userid.Value = Request.QueryString["u_id"];

SqlCmd.Parameters.Add(_userid);

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

所以,使用参数化的sql语句,是一种很好的做法

Dim sql As StringBuilder = New StringBuilder()

sql.Append("")

sql.Append("SELECT * FROM test")

sql.Append(" WHERE a= @p1 ")

Dim command As SqlCommand = dac.CreateCommand(sql.ToString()) 'dac为自己写的类

Dim param As SqlParameter = New SqlParameter()

param .ParameterName = "@p1"

param .SqlDbType = SqlDbType.NVarChar

param .Value = b 'b为该函数的参数(ByVal b as String)

command .Parameters.Add(param)

Dim reader As SqlDataReader = command.ExecuteReader()

SqlParameter 构造函数

SqlParameter 构造函数 (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)

初始化 SqlParameter 类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion 值之一、用于源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集合的名称。

命名空间: System.Data.SqlClient

程序集: System.Data(在 system.data.dll 中)

C#

public SqlParameter (

string parameterName,

SqlDbType dbType,

int size,

ParameterDirection direction,

byte precision,

byte scale,

string sourceColumn,

DataRowVersion sourceVersion,

bool sourceColumnNullMapping,

Object value,

string xmlSchemaCollectionDatabase,

string xmlSchemaCollectionOwningSchema,

string xmlSchemaCollectionName

)

参数

parameterName

要映射的参数的名称。

dbType

SqlDbType 值之一。

size

参数的长度。

direction

ParameterDirection 值之一。

precision

要将 Value 解析为的小数点左右两侧的总位数。

scale

要将 Value 解析为的总小数位数。

sourceColumn

源列的名称。

sourceVersion

DataRowVersion 值之一。

sourceColumnNullMapping

如果源列可为空,则为 true;如果不可为空,则为 false

value

一个 Object,它是 SqlParameter 的值。

xmlSchemaCollectionDatabase

XML 实例的架构集合所在的数据库的名称。

xmlSchemaCollectionOwningSchema

包含此 XML 实例的架构集合的关系架构。

xmlSchemaCollectionName

此参数的架构集合的名称。

备注

如果未在 size precision 参数中显式设置 Size Precision,则从 dbType 参数的值推断出它们。

SqlParameter

表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。

有关此类型所有成员的列表,请参阅 SqlParameter 成员。

System.Object

System.MarshalByRefObject

System.Data.SqlClient.SqlParameter

[Visual Basic]

NotInheritable Public Class SqlParameter

Inherits MarshalByRefObject

Implements IDbDataParameter, IDataParameter, ICloneable

[C#]

public sealed class SqlParameter : MarshalByRefObject,

IDbDataParameter, IDataParameter, ICloneable

[C++]

public __gc __sealed class SqlParameter : public

MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable

[JScript]

public class SqlParameter extends MarshalByRefObject implements

IDbDataParameter, IDataParameter, ICloneable

线程安全

此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

备注

参数名称不区分大小写。

示例

[Visual Basic, C#, C++] 下面的示例通过 SqlDataAdapter 中的 SqlParameterCollection 集合创建 SqlParameter 的多个实例。这些参数用于从数据源中选择数据并将数据放在 DataSet 中。此示例假定已经用适当的架构、命令和连接创建了 DataSet SqlDataAdapter

[Visual Basic]

Public Sub AddSqlParameters()

' ...

' create myDataSet and myDataAdapter

' ...

myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters"

myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239

myDataAdapter.Fill(myDataSet)

End Sub 'AddSqlParameters

[C#]

public void AddSqlParameters()

{

// ...

// create myDataSet and myDataAdapter

// ...

myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";

myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239;

myDataAdapter.Fill(myDataSet);

}

[C++]

public:

void AddSqlParameters()

{

// ...

// create myDataSet and myDataAdapter

// ...

myDataAdapter->SelectCommand->Parameters->Add(S"@CategoryName", SqlDbType::VarChar, 80)->Value = S"toasters";

myDataAdapter->SelectCommand->Parameters->Add(S"@SerialNum", SqlDbType::Int)->Value = __box(239);

myDataAdapter->Fill(myDataSet);

}

[JScript] 没有可用于 JScript 的示例。若要查看 Visual BasicC# C++ 示例,请单击页左上角的“语言筛选器”按钮

要求

命名空间: System.Data.SqlClient

平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版

程序集: System.Data ( System.Data.dll )

使用SqlParameter

SqlParameter[] p =

{

SqlHelper.MakeInParam("@EntryID",SqlDbType.Int,4,ev.EntryID),

SqlHelper.MakeInParam("@BlogID",SqlDbType.Int,4,ev.BlogID),

SqlHelper.MakeInParam("@URL",SqlDbType.NVarChar,255,DataHelper.CheckNull(ev.ReferralUrl)),

SqlHelper.MakeInParam("@IsWeb",SqlDbType.Bit,1,ev.PageViewType)

};

SqlHelper.ExecuteNonQuery(conn,CommandType.StoredProcedure,"blog_TrackEntry",p);

答疑:SqlParameter赋值之后怎么添加值

SqlCommand我知道用add

但我想问的是 SqlParameter

例如

SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);

parm.Value = orderId;

之后能不能再改parm添加一个值

因为我写了个方法是传递SqlParameter类型的参数

但有时要做些判断

SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);

parm.Value = orderId;

if(...)

{

//添加一个参数

}

ExecuteReader(parm,.....);

请问应该怎么做呢

最佳答案 int IArticle.Insert(ArticleInfo article)

{

//如果对象存在

if (article.ID != -1)

return -1;

else

article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");

//统计执行成功的数量

int successCount = 0;

string SQL_THIS = SQL_INSERT_ARTICLE;

SqlParameter[] paras = GetParas();

paras[0].Value = article.ID;

paras[1].Value = article.Title;

paras[2].Value = article.DateAdded;

paras[3].Value = article.Text;

paras[4].Value = article.SourceUrl;

paras[5].Value = article.PostType;

paras[6].Value = article.Author;

paras[7].Value = article.Email;

paras[8].Value = article.SourceName;

paras[9].Value = article.BlogID;

paras[10].Value = article.CategoryID;

paras[11].Value = article.Summary;

paras[12].Value = article.IsBySummary;

paras[13].Value = article.DateUpdated;

paras[14].Value = article.TitleUrl;

paras[15].Value = article.FeedBackCount;

paras[16].Value = article.PostConfig;

paras[17].Value = article.EntryName;

paras[18].Value = article.KeyWord;

SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);

successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);

return successCount;

}

声明:本帖转自 http://www.cnblogs.com/angelfeather/articles/1225902.html

在此对本帖原创作者,致以最诚挚的谢意!

=============================================

例子:

SqlParameter[] paraList = new SqlParameter[7];

paraList[0] = new SqlParameter( "@userName ", SqlDbType.VarChar, 50);

paraList[0].Value = personModel.UserName;

paraList[1] = new SqlParameter( "@account ", SqlDbType.VarChar, 100);

paraList[1].Value = personModel.Account;

paraList[2] = new SqlParameter( "@pwd ", SqlDbType.VarChar, 100);

paraList[2].Value = personModel.Pwd;

paraList[3] = new SqlParameter( "@unitID ", SqlDbType.VarChar, 20);

paraList[3].Value = personModel.UnitID;

paraList[4] = new SqlParameter( "@email ", SqlDbType.VarChar, 100);

paraList[4].Value = personModel.Email;

paraList[5] = new SqlParameter( "@officeTel ", SqlDbType.VarChar, 20);

paraList[5].Value = personModel.OfficeTel;

paraList[6] = new SqlParameter( "@mobile ", SqlDbType.VarChar, 20);

paraList[6].Value = personModel.Mobile;

return sd.ExecuteNonQuery( "UP_Person_ADD ", paraList);

声明:本帖转自 http://hljncxjh.blog.163.com/blog/static/7616708200862085248668/

在此对本帖原创作者,致以最诚挚的谢意!

=============================================

sqlparameter问题,解决参考方法参见网址:

http://topic.csdn.net/t/20050902/15/4246228.html

分享到:
评论

相关推荐

    C#中SqlParameter类使用方法小结.doc

    C#中SqlParameter类使用方法小结.doc

    C# 中SqlParameter类的使用方法小结.docx

    。。。

    c#项目结束后的总结

    2)IDAL类:接口层,定义在SQLDAL中需要使用的方法; 3)SQLDAL类:数据持久层,实现接口中的方法,用DBUtility类中包装的SQL方法操作数据库; 4)BLL类:业务逻辑层,定义调用SQLDAL类中的方法,被WEB类中的事件...

    Visual.C#2010从入门到精通

    学习以c#的必备书 本书介绍了如何使用Visual C++ 6.0编写Windows应用程序。全书内容全面、结构清晰、由浅入深、注重实用,并结合了大量的实例,以方便读者理解。本书既包含菜单、鼠标、键盘等基本操作,又包含图形...

    [C#.NET2005]VS2005中使用水晶报表和水晶报表使用指南 word格式

    我把水晶报表在vs2005的使用方法总结一下,供大家参考。 首先介绍一下我用的软件环境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005 【数据用例】 服务器:SQLEXPRESS 数据库名:Test 数据库表:T 数据...

    ASP.NET 控件的使用

    1.5 小结 37 第2章 使用标准控件 38 2.1 显示信息 38 2.1.1 使用Label控件 38 2.1.2 使用Literal控件 42 2.2 接收用户输入 44 2.2.1 使用TextBox控件 44 2.2.2 使用CheckBox控件 50 2.2.3 使用RadioButton控件 52 ...

    ASP.NET.4揭秘

    asp.net 4揭秘.第1卷》 第一部分 构建asp.net页面 第1章 asp.net framework概览2 1.1 asp.net和.net framework5 1.1.1 框架类库5 1.1.2 公共语言运行库10 1.2 asp.net控件11 1.2.1 asp.net控件概览11 ...25.4 小结882

    ADO.NET 2.0技术内幕(高清 中文 带书签 全)

    4.5 SqlCommand,SqlDataReader和SqlParameter的对象参考 4.6 常见问题 第5章 用SqlDataAdapfer对象获取数据 5.1 何为SqlDataAdapter对象 5.2 创建并使用SqlDataAdapter对象 5.3 Visual Studio 2005设计时特性 5.4 ...

    亮剑.NET深入体验与实战精要2

    5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 ...

    亮剑.NET深入体验与实战精要3

    5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 ...

    ASP.NET的网页代码模型及生命周期

    下面小结了一些客户端状态的优缺点。 q 视图状态:推荐当存储少量挥发到自身的页面的信息时使用。 q 控件状态:不需要任何服务器资源,控件状态是不能被关闭的,提供了控件管理的更加可靠和更通用的方法。 q 隐藏域...

Global site tag (gtag.js) - Google Analytics