C 中SqlParameter類的使用方法小結
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
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;
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