當前位置:首頁 » 編程語言 » sql參數化插入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql參數化插入

發布時間: 2022-08-21 10:37:41

sql為什麼要參數化,怎麼參數化

一、最主要是: 資料庫 機制問題,參數化 可以加快 執行效率,資料庫有個緩存區,可以緩存 非參數部分的語句(或者說 下次執行不用資料庫再次 解析語句),而不用參數,每次資料庫 都需要解析 語句
二、次要是:防止,sql語句特殊字,注入:減少,字元轉義等
三、清晰 便於理解

Ⅱ C#對MYsql批量添加參數化:如圖 怎麼實現參數化

///<summary>
///用於新增記錄的SQL語句
///</summary>
privateconstStringINSERT_SQL=
@"
INSERTINTOsale_report(
sale_date,sale_item,sale_money
)VALUES(
?sale_date,?sale_item,?sale_money
)";


///<summary>
///插入數據.
///</summary>
///<paramname="conn"></param>
privatevoidInsertData(MySqlConnectionconn)
{
//創建一個Command.
MySqlCommandinsertCommand=conn.CreateCommand();

//定義需要執行的SQL語句.
insertCommand.CommandText=INSERT_SQL;

//定義要查詢的參數.

insertCommand.Parameters.Add(newMySqlParameter("?sale_date",TEST_SALE_DATE));
insertCommand.Parameters.Add(newMySqlParameter("?sale_item",TEST_SALE_ITEM));
insertCommand.Parameters.Add(newMySqlParameter("?sale_money",100000));


//ExecuteNonQuery方法,表明本次操作,不是一個查詢的操作。將沒有結果集合返回.
//返回的數據,將是被影響的記錄數.
intinsertRowCount=insertCommand.ExecuteNonQuery();

Console.WriteLine("嘗試插入數據,結果造成了{0}條記錄的插入。",insertRowCount);

}

Ⅲ 執行sql語句時參數化,有什麼好處

防注入。
比如你登錄的語句寫成:
string sql="select uid from login where uid='"+uid+"' and pwd='"+pwd+"'";
那隻需要把密碼寫成'or'0'='0就可以登錄了

Ⅳ 給mssql 資料庫里 插入 數據問題!拜託了各位 謝謝

哎,。參數化就行了。。 SqlConnection scon = new SqlConnection("你的資料庫鏈接"); scon.Open(); //打開資料庫鏈接 SqlParameter[] sqlparameter = { new SqlParameter("@id",txtuserid.Text.ToString().Trim()) //這里是參數化,txtuserid.Text.ToString().Trim()為用戶輸入的用戶名即id }; SqlCommand ocom = new SqlCommand("select * from [users] where id=@id", scon); ocom.Parameters.AddRange(sqlparameter); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); sqlDataAdapter.SelectCommand = ocom; DataSet dataSet = new DataSet(); sqlDataAdapter.Fill(dataSet); if (dataSet.Tables[0].Rows.Count > 0) { //txtanswer.Text 為TextBox控制項,由用戶輸入答案。 if (txtanswer.Text.ToString().Trim() == dataSet.Tables[0].Rows[0]["answer "].ToString()) { SqlConnection scon = new SqlConnection("你的資料庫鏈接"); scon.Open(); //打開資料庫鏈接 SqlParameter[] sqlparameter = { new SqlParameter("@passwd",txtuserid.Text.ToString().Trim()), //這里是參數化,txtnewpasswd.Text.ToString().Trim()為用戶輸入的新密碼 new SqlParameter("@id",dataSet.Tables[0].Rows[0]["id"].ToString()) }; SqlCommand ocom = new SqlCommand("update [users] set passwd=@passwd where id=@id", scon); //更新語句 ocom.Parameters.AddRange(sqlparameter); ocom.ExecuteNonQuery(); ocon.Close(); } else { //回答錯誤 } } else { //沒有這個用戶ID哦,你確定你注冊了? } scon.Close(); 呵呵,。剛剛回答別人一個問題,。裡面剛好有可疑回答你的。參數化後,不管你添加的內容有什麼字元,都可以添加成功,參數化也可以防止注入式攻擊的,建議以後,每個有讓用戶輸入數據的都要進行參數化,這樣會安全點。

Ⅳ sql怎麼使用參數化

採用sp_executesql 系統存儲過程,執行sql語句,就能傳入參數,

這就是sql參數化sql腳本參數化

你可以根據上面的例子,將sql腳本中定義參數,然後後面賦值參數變數,

在查詢分析器中執行,你就可以知道sql參數化的具體實現和概念了。

如有疑問,請及時溝通!

請採納!

Ⅵ 參數化之後還是有sql注入,求教

首先:我們要了解SQL收到一個指令後所做的事情:

具體細節可以查看文章:Sql Server 編譯、重編譯與執行計劃重用原理

在這里,我簡單的表示為: 收到指令 -> 編譯SQL生成執行計劃 ->選擇執行計劃 ->執行執行計劃。

具體可能有點不一樣,但大致的步驟如上所示。

接著我們來分析為什麼拼接SQL 字元串會導致SQL注入的風險呢?

首先創建一張表Users:
CREATE TABLE [dbo].[Users](

[Id] [uniqueidentifier] NOT NULL,

[UserId] [int] NOT NULL,

[UserName] [varchar](50) NULL,

[Password] [varchar](50) NOT NULL,

CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED

(

[Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

插入一些數據:
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),1,'name1','pwd1');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),2,'name2','pwd2');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),3,'name3','pwd3');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),4,'name4','pwd4');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),5,'name5','pwd5');

假設我們有個用戶登錄的頁面,代碼如下:

驗證用戶登錄的sql 如下:
select COUNT(*) from Users where Password = 'a' and UserName = 'b'

這段代碼返回Password 和UserName都匹配的用戶數量,如果大於1的話,那麼就代表用戶存在。

本文不討論SQL 中的密碼策略,也不討論代碼規范,主要是講為什麼能夠防止SQL注入,請一些同學不要糾結與某些代碼,或者和SQL注入無關的主題。

可以看到執行結果:

這個是SQL profile 跟蹤的SQL 語句。

注入的代碼如下:
select COUNT(*) from Users where Password = 'a' and UserName = 'b' or 1=1—'

這里有人將UserName設置為了 「b' or 1=1 –」.

實際執行的SQL就變成了如下:

可以很明顯的看到SQL注入成功了。

很多人都知道參數化查詢可以避免上面出現的注入問題,比如下面的代碼:
class Program
{
private static string connectionString = "Data Source=.;Initial Catalog=Test;Integrated Security=True";

static void Main(string[] args)
{
Login("b", "a");
Login("b' or 1=1--", "a");
}

private static void Login(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//為每一條數據添加一個參數
comm.CommandText = "select COUNT(*) from Users where Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar) { Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar) { Value = userName},
});

comm.ExecuteNonQuery();
}
}
}

實際執行的SQL 如下所示:
exec sp_executesql N'select COUNT(*) from Users where Password = @Password and UserName = @UserName',N'@Password varchar(1),@UserName varchar(1)',@Password='a',@UserName='b'
exec sp_executesql N'select COUNT(*) from Users where Password = @Password and UserName = @UserName',N'@Password varchar(1),@UserName varchar(11)',@Password='a',@UserName='b'' or 1=1—'

可以看到參數化查詢主要做了這些事情:
1:參數過濾,可以看到 @UserName='b'' or 1=1—'
2:執行計劃重用

因為執行計劃被重用,所以可以防止SQL注入。

首先分析SQL注入的本質,

用戶寫了一段SQL 用來表示查找密碼是a的,用戶名是b的所有用戶的數量。

通過注入SQL,這段SQL現在表示的含義是查找(密碼是a的,並且用戶名是b的,) 或者1=1 的所有用戶的數量。

可以看到SQL的語意發生了改變,為什麼發生了改變呢?,因為沒有重用以前的執行計劃,因為對注入後的SQL語句重新進行了編譯,因為重新執行了語法解析。所以要保證SQL語義不變,即我想要表達SQL就是我想表達的意思,不是別的注入後的意思,就應該重用執行計劃。

如果不能夠重用執行計劃,那麼就有SQL注入的風險,因為SQL的語意有可能會變化,所表達的查詢就可能變化。

在SQL Server 中查詢執行計劃可以使用下面的腳本:
DBCC FreeProccache

select total_elapsed_time / execution_count 平均時間,total_logical_reads/execution_count 邏輯讀,
usecounts 重用次數,SUBSTRING(d.text, (statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset END
- statement_start_offset)/2) + 1) 語句執行 from sys.dm_exec_cached_plans a
cross apply sys.dm_exec_query_plan(a.plan_handle) c
,sys.dm_exec_query_stats b
cross apply sys.dm_exec_sql_text(b.sql_handle) d
--where a.plan_handle=b.plan_handle and total_logical_reads/execution_count>4000
ORDER BY total_elapsed_time / execution_count DESC;

Ⅶ C#連接access資料庫,如何向一個表中參數化插入操作

先給你一個方法,你可以讓到相應的地方
public bool ExecuteSql(string SqlString,params OleDbParameter[] parameters)
{
bool result = false;
OleConnection conn = new OleConnection("連接字元串")
OleDbCommand cmd = new OleDbCommand(SqlString, conn);
cmd.CommandType = CommandType.Text;
if(parameters!=null)
{
foreach(OleDbParameter p in parameters)
{
if((p.Direction== ParameterDirection.Output)&&p.Value==null) p.Value = DBNull.Value;
cmd.Parameters.Add(p);
}
}
try
{
conn.Open();
cmd.ExecuteNonQuery();
result = true;
}
catch
{
}
finally
{
conn.Close();
}
return result;
}

調用時:
string sql = "insert into tablename(name,sex,brithday,address,zip) values(@name,@sex,@brithday,@address,@zip)";
OleDbParameter[] parameters = new OleDbParameter[]{
new OleDbParameter("@name",namevalue),
new OleDbParameter("@sex",sexvalue),
new OleDbParameter("@brithday",brithdayvalue),
new OleDbParameter("@address",addressvalue),
new OleDbParameter("@zip",zipvalue)
};
bool flag = ExecuteSql(sql,parameters);
運行成功會返回真,否則為假,上面的值我沒有寫具體的,你自己寫就行了

Ⅷ 參數化sql的SQL語句中,往oracle庫中插入序列.nextval,參數該付什麼類型的值

1.nextval與序列關聯,表示下一個,如:
創建里一個序列seq_1:#序列一般表示第幾行,起標識作用
create sequence seq_1 increment by 1 start with 1
在表中使用此序列:
INSERT INTO A VALUES (seq_1.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
2.values與insert 連用,標示插入的欄位值,如:
有一個表 A,A有三個欄位:name,age,sex,都是archar2類型的,則往表中插入數據語句為:
insert into A values ('name','age','woman')

Ⅸ ASP.NET C# SQL參數化

代碼沒有,倒是可以給你三個建議:
1、使用存儲過程,這樣就參數化了,可以防止sql語句的非法注入
2、寫一個函數,把插入語句的sql中的 ' 字元替換為空:
public static string Filtered(string str)
{
str = str.Replace("'", "");
str = str.Replace("@", "");
str = str.Replace("=", "");
str = str.Replace("!", "");
str = str.Replace(" ", "");
str = str.Replace(".", "");
str = str.Replace("[", "");
str = str.Replace("\\", "");
return str;
}
3.登錄的時候將文本框內的內容加密輸入資料庫。。。

Ⅹ 怎麼在sql數據插入大連數據

有三種批量插入數據的方法。
第一種方法是使用循環語句逐個將數據項插入到資料庫中。第二種方法使用的是SqlBulkCopy,使您可以用其他源的數據有效批量載入SQLServer表。第三種使用的方法是sqlserver中的表值參數方法。
表值參數是SQLServer2008中的新參數類型。表值參數是使用用戶定義的表類型來聲明的。使用表值參數,可以不必創建臨時表或許多參數,即可向TransactSQL語句或常式如存儲過程或函數發送多行數據。