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 Basic、C# 或 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 类的使用方法小结 在 C# 中,SqlParameter 类是一个非常重要的类,它可以帮助我们避免 SQL 注入的危害。下面我们将详细讲解 SqlParameter 类的使用方法和避免 SQL 注入的技巧。 一、直接在 SQL...
根据提供的信息,我们可以深入探讨C#中的`SqlParameter`参数及其在数据库操作中的应用。下面将详细介绍如何使用`SqlParameter`以及其在SQL查询执行中的具体作用。 ### C# SqlParameter 参数详解 `SqlParameter`类...
总结来说,C#操作SQL的公共类如SqlHelper,是实现数据库操作的一种高效方式,它简化了数据库交互的代码,提高了代码的可维护性,并通过缓存参数和使用静态方法优化了性能。开发者可以根据实际需求,扩展此类以满足更...
同时,使用SqlParameter来传递参数,可以防止SQL注入攻击。 四、动态SQL与存储过程 1. 动态SQL:在C#中,你可以使用字符串操作生成动态SQL语句,这在需要根据条件生成不同结构的SQL时非常有用。例如,你可以根据...
在这个总结中,我们将深入探讨DBHelper类及其在C#中连接数据库的应用。 1. DBHelper类的概念: DBHelper类通常是为了封装ADO.NET组件,如SqlConnection、SqlCommand、SqlDataAdapter等,以提供更简洁、安全的数据库...
在C#中,可以通过`SqlParameter`类来定义这些参数,并将它们添加到`SqlCommand`对象的`Parameters`集合中。 ```csharp // 定义输出参数 SqlParameter sp1 = new SqlParameter("@outcome", SqlDbType.Bit); sp1....
在C#中,你可以创建一个DBHelper类,包含如ExecuteNonQuery、ExecuteScalar、ExecuteReader等方法,分别对应不同的数据库操作。DBHelper通常会管理数据库连接的生命周期,如使用连接池来优化性能,处理异常等,使得...
3. **SqlParameter 语句方式的Exists方法**:除了SQL语句方式,还提供了使用`SqlParameter`的版本,允许更灵活的参数传递,增强了SQL注入防护能力。 【使用企业库的优势】 使用Enterprise Library可以带来以下优势...
总结,C#调用SQL Server 2000存储过程时,无论是输入参数还是输出参数,关键在于正确创建`SqlCommand`对象,设置`CommandType`,定义`SqlParameter`对象,并将其添加到`Parameters`集合中。理解这些步骤对于进行...
在C#中,可以使用SqlParameter类来将二进制流保存到SQL Server数据库。下面是一个简单的示例代码: ```csharp using System.Data.SqlClient; // 创建SqlConnection对象 SqlConnection conn = new SqlConnection(...
### C#中企业库及其使用方法 #### 一、企业库简介 Enterprise Library 是由 Microsoft Patterns & Practices 团队开发的一套组件集,用于帮助开发者更高效地构建可扩展、可维护的应用程序。Enterprise Library 2.0...
3. 参数化查询:通过添加SqlParameter对象防止SQL注入攻击。 4. 数据读取:使用SqlDataReader或SqlDataAdapter获取查询结果并填充DataSet或DataTable。 5. 错误处理:捕获和处理SqlException,确保程序健壮性。 ...
根据给定的文件信息,我们可以总结出以下关于C#中SQLDBHelp类的关键知识点: ### 一、连接数据库 在`SQLDBHelp`类中,`SqlConnection`对象用于与数据库建立连接。`SqlConnection`对象是.NET Framework中的一个关键...
在本场景中,我们关注的是一个名为"C#中oracle连接数据库的封装类"的主题,这个主题涉及到创建一个名为`DbHelperOra.cs`的类,用于简化与Oracle数据库的交互。这种封装可以提高代码的可读性和复用性,减少直接处理...
4. **参数化查询**:如果查询包含动态条件,使用SqlParameter来避免SQL注入攻击。 5. **执行查询**:调用SqlCommand的ExecuteReader方法来执行查询,这将返回一个SqlDataReader对象,可以用来遍历结果集。 6. **...
总结来说,C#中的数据库工具类是为了简化和规范化数据库操作,通过封装常用方法,使得数据库访问变得更加便捷和安全。`SQL.cs`文件很可能是实现这些功能的核心代码。在实际开发中,根据项目需求,还可以扩展工具类,...
SqlParameter param = new SqlParameter("rval", SqlDbType.Int); param.Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add(param); sqlConn.Open(); Label1.Text = cmd.ExecuteNonQuery()....
总结起来,通过上述知识点的学习,我们可以更好地理解和掌握如何使用C#进行数据库操作,包括事务处理、动态SQL构建、存储过程调用、查询分页以及正确处理NULL值等关键方面。这些技能对于开发高效稳定的应用程序至关...