1. 程式人生 > >C 中SqlParameter類的使用方法小結

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;

           

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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述