台灣最大程式設計社群網站
線上人數
1774
 
會員總數:243308
討論主題:188090
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 留言板轉換 varchar 到資料類型 numeric 時發生算術溢位錯誤。 陳述式已經結束。
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
留言板轉換 varchar 到資料類型 numeric 時發生算術溢位錯誤。 陳述式已經結束。
價值 : 100 QP  點閱數:848 回應數:8

樓主

hat456
門外漢
0 1
36 3
發送站內信

各位大大
小弟我呢最近剛開始學visual studio和SQL SERVER
以下是我輸入的程式碼
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(sqldb);
conn.Open();

sql = "insert into Discussion_board(Member_ID,Book_ID,Book_Name,Discussion_Content) values ('" + GridView3.Rows[0].Cells[0] + "', '" + GridView2.Rows[0].Cells[0] + "', '" + GridView2.Rows[0].Cells[1] + "', '" + TextBox1.Text + "' )";


System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();

我想留言版的資料輸入到資料庫裡
但是他會跑出varchar 到資料類型 numeric 時發生算術溢位錯誤。 陳述式已經結束。的錯誤指令
資料庫裡面的Meber_ID,Book_ID(numeric)型態
有沒有方法可以直接將varchar轉到numeric?
請問這要怎麼解決?
拜託各位了
小弟很菜 不要砲的太嚴重

搜尋相關Tags的文章: [ 資料型態轉換錯誤 ] ,
本篇文章發表於2017-12-29 13:46
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
1.不要用組字串的方式組SQL語法,會有SQL Injection問題
強烈建議,養成使用Parameter的好習慣

2.資料在放入進行SQL維護之前,應該先檢查各資料是否有異常

3.SqlReader的特性是連線的資料讀取,不適合用來維護資料。
您處理新增,建議不要用ExecuteReader,資料維護建議使用ExecuteNonQuery()

4.connection建議使用Using來宣告,這樣才不會忘記回收,造成一堆沒用卻還沒回收的Connection卡在系統中
每一條Connection都是寶貴的系統資源

類似以下這樣

本篇文章回覆於2017-12-29 15:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

hat456
檢舉此回應
謝謝你的回答和建議
不過我有另一個問題
sql = "insert into Discussion_board(Member_ID) values ('" +session["Member_ID"] + "')";
他會顯示varchar 轉換到 numeric 時發生錯誤
我原本想說用gridview3 然後在裡面設定session他可以抓到Member_ID 然後他的值會是數值
如果我想用session來抓Member_ID的話我要如何修改呢?
本篇文章回覆於2017-12-29 21:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
convert 一下吧
本篇文章回覆於2017-12-29 23:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

topcat
捐贈 VP 給 topcat 檢舉此回應
sql = "insert into Discussion_board(Member_ID) values ('" +session["Member_ID"] + "')";

SQL Injection的可怕,是您有可能因為這樣寫產生的漏洞,讓駭客輕易的就可以把你的主機格式化
無論如何,先把這問題改過,再繼續問下去

^.^a
本篇文章回覆於2017-12-30 12:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

hat456
檢舉此回應
原來如此
謝謝^^
本篇文章回覆於2017-12-30 12:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
請參考小喵#1範例∼

1.務必用參數來傳遞,不要用組字串的方式處理SQL語法
2.為何小喵會先設定指定型態的變數?
設定變數且指定型態,那麼變數到SQL運作這部分,就不會是問題
也就是可以把問題與SQL的存取切開

因此,剩下的是Session["Member_ID"]與變數『Member_ID』的關係

本篇文章回覆於2017-12-30 23:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

hat456
檢舉此回應
3Q 我一直在想你說的不要用字串來組是什麼意思
後來想到sql="" 哈哈
再次感謝^^
我一直單純的想要用簡單的方式來完成
本篇文章回覆於2017-12-31 07:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
我一直在想你說的不要用字串來組是什麼意思


這是透過字串相加,把您要帶入SQL的「資料」放在SQL語法



您可能覺得奇怪,這會有什麼問題
如果Session["Member_ID"]的內容是以下


那麼,原本的「資料」,卻變成可運作的「指令」。
您的SQL指令就會變成


他就變成兩段指令,一段註解

;是SQL指令的區隔符號,用來切分一段一段的指令
--是SQL中的註解

於是,您的資料表 Discussion_board 就被 Drop 掉
可怕嗎?
這還不是最可怕的方式,還有更邪惡的∼


所以
應該改用參數的方式


這樣,無論被塞入什麼樣的攻擊指令,資料都永遠只是『資料』,不會變成好幾段指令

詳細,建議您搜尋一下關鍵字『SQL Injection』進行瞭解
^_^
本篇文章回覆於2018-01-02 09:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.