台灣最大程式設計社群網站
線上人數
1820
 
會員總數:242949
討論主題:187843
歡迎您免費加入會員
討論區列表 >> ASP.NET >> vb程式碼合併問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
vb程式碼合併問題
價值 : 100 QP  點閱數:306 回應數:12

樓主

阿偉
門外漢
0 8
545 25
發送站內信

書上的範例
檢測資料庫有無資料
如果有顯示資料重複無法輸入

用編號與資料庫比對帶出員工姓名
將兩個範例合併
試著用兩個label顯示出來

程式碼如下

Protected Sub TextBox4_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged

Dim args1 As New DataSourceSelectArguments

Dim DR1 As SqlDataReader = SqlDataSource1.Select(args1)

CONN1.ConnectionString = "Data Source=YAMAHA;Initial Catalog=DGOT;Persist Security Info=True;User ID=ya;Password=maha"
CONN1.Open()

Dim sql1 As String
sql1 = "SELECT MV002 FROM CMSMV WHERE MV001='" & TXT_ID3 & "'"

Dim SQLDAT1 As SqlCommand = New SqlCommand(sql1, CONN1)

Dim dr As SqlDataReader = SQLDAT1.ExecuteReader()
dr.Read()
Try
LBL_name.Text = dr.Item("MV002")
SQLDAT1.Cancel()
dr.Close()

CONN1.Close()
CONN1.Dispose()
Catch ex As Exception
LBL_name.Text = "無資料"
SQLDAT1.Cancel()
dr.Close()

CONN1.Close()
CONN1.Dispose()
End Try

'偵測資料重複
DR1.Read()
If DR1.HasRows = True Then

Label3.Text = TXT_ID1.Text + "資料重複!無法新增"
TXT_ID1.Text = ""
TXT_ID2.Text = ""
TXT_ID3.Text = ""
TXT_ID1.Focus()

Else
Label3.Text = "可新增"
TXT_DGA1.Focus()
End If



End Sub

卻出現
DataSourceSelectArguments , SqlDataReader = SqlDataSource1.Select(args1) 的錯誤訊息
請各位前輩指導
謝謝。

搜尋相關Tags的文章: [ DataSourceSelectArguments ,SqlDataReader 使用方法 ] ,
本篇文章發表於2018-06-12 22:54
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

阿偉
檢舉此回應
無法將類型 'System.Data.DataView' 的物件轉換為類型 'System.Data.SqlClient.SqlDataReader'。

錯誤訊息如上,謝謝
本篇文章回覆於2018-06-13 08:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
1.小舖貼程式碼,有工具可以用,建議您務必使用
例如您這個是VB,就可以用 [Code]VB 的工具
幫您整理大約如下:



2.錯誤訊息
無法將類型 'System.Data.DataView' 的物件轉換為類型 'System.Data.SqlClient.SqlDataReader'。

這其實說的很明顯了

左邊的型態是『System.Data.SqlClient.SqlDataReader』
右邊回傳的型態是『System.Data.DataView』
『=』等號兩邊的型態應該要一致

您等號兩邊的東西是很不一樣的東西
DataReader是什麼,看一下
DataAdapter 和 DataReader

DataView是什麼,看一下
DataView

如果您對於以上這兩個看完還是很模糊
您可能要補充更完整的ADO.NET的相關知識

小喵個人非常不建議在程式碼中,還去用DataSource取值
畢竟DataSource只能用在ASP.NET WebForm
哪天,您的系統可能要改寫成WebAPI, MVC, ...等等其他的架構
改寫系統的人會很恨這些寫DataSource的人
因為都不能重複使用,全部必須改寫

至於該怎麼改,您的後半用的是SqlDataReader,透過ADO.NET的方是處理
建議用相同的方式來做

或者,可以試著去學其他的資料存取的方式,例如:Entity Framework


3.

這會有SqlInjection的問題∼
這是很嚴重的,等於您再您的系統埋下很大的資安漏洞
這樣的寫法,駭客可以任意的完你的資料庫,甚至主機
可能資料被刪、可能資料表整個不見,還可能整台Server被格式化

知名的技術部落客 黑暗執行緒 黑大曾說
如果不知道SQL Injection是什麼,讓他上戰場
那不如打斷手,上石膏,先不要讓他寫Code
以免不斷的寫出殘害系統的程式碼

對,就是這麼嚴重∼

您應該學使用Parameter的寫法,即使是在練習,也要養成習慣,疑慮使用Parameter的做法,而不要輕易的將使用者輸入的東西
用組字串的方式放進你的SQL語法

應該類似這樣:


------
建議您把您的需求,再次詳細地描述一次,我如果有時間,可以寫一段示範程式碼給你參考
^_^
本篇文章回覆於2018-06-13 09:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

MIS2000 Lab
檢舉此回應
Q : 檢測資料庫有無資料
如果有顯示資料重複無法輸入

A :
(1)檢測有無資料?
直接用 dr.HasRows即可
不必先讀取 ( .Read())

(2) 發問時,DB連結字串不用寫出來,裡面有私密資訊

(3) CONN1.Dispose()。使用 VS 2017去檢測,他說這段可省略。以您的範例來說,以後不用寫。

(4) 參數寫法, topcat大大已經說明了。或參閱 --

[FAQ] ADO.NET 參數寫法 Parameter(避免SQL Injection資料隱碼攻擊)
http://mis2000lab.pixnet.net/blog/post/34581695
http://mis2000lab.pixnet.net/blog/post/34581705

希望對您有幫助 :-)
本篇文章回覆於2018-06-13 10:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

阿偉
檢舉此回應
謝謝兩位,提供了那麼多資訊,非常感激
好多東西都是沒有想過的問題,真的很感謝。

想另外請問
Dim DR1 As SqlDataReader = SqlDataSource1.Select(args1)
看過解釋後知道兩個是不相同的屬性
請問我需要怎麼做修改??
感謝指導
本篇文章回覆於2018-06-13 18:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

MIS2000 Lab
檢舉此回應
SqlDataSource骨子裡面,也是 DataSet / DataReader
不信的話,你找一下他的 DataSourceMode屬性,親眼看看 :-)

你既然可以自己寫 ADO.NET(不管是 SqlCommand/DataReader 或 SqlDataAdapter / DataSet)
為什麼不親自寫?
還要透過這一層包裝(SqlDataSource) ???

買本書 (現在有特價 https://www.tenlong.com.tw/products/9789572245682)
或是
再看一下MSDN的說明吧
例如SqlCommand的 ExecuteReader(),其實您的程式碼已經有這一段囉
本篇文章回覆於2018-06-14 09:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

阿偉
檢舉此回應
感謝兩位
謝謝指導
!!!
本篇文章回覆於2018-06-14 19:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

阿偉
檢舉此回應
兩位前輩
我以為我修改好了
但是結果還是不對
變成只要在資料庫堶悸(CONA04)都會被判斷成 資料已重複!無法新增
請問我哪裡做錯了嗎
請指導,謝謝..........




本篇文章回覆於2018-06-14 21:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
變成只要在資料庫堶悸(CONA04)都會被判斷成 資料已重複!無法新增


是否請您用描述的,描述一下
『資料重複』的條件是什麼?



另外,您的資料表,應該有『主索引(Primary Key)』吧
如果您不清楚『主索引』是什麼
這個務必搞清楚,這是資料表最根本必須的重要環節之一

懇請樓主先針對以上的問題回覆一下
也許回覆的過程中,就可以發現問題了

加油∼感恩∼
^_^


本篇文章回覆於2018-06-15 09:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

阿偉
檢舉此回應
MDCONA
欄位有
CONA01,CONA02,CONA03,CONA04

CONA01為主KEY
CONA01資料是來自於
CONA02+CONA03
CONA02為日期EX:20180615
CONA03為編號EX:107001
CONA01就會等於20180615107001


在TXT_CONA04中會輸入編號 EX: 107001
在TXT_CONA02中會輸入日期 EX: 20180615
希望的結果是 在TXT_CONA04中輸入編號後
能夠判斷 CONA01欄位 是否有重複資料 EX:20180615107001
如果有,就出現資料重複,如果沒有,顯示可新增

非常感謝版主的熱心
小弟覺得很感激也很感動
感覺是我邏輯上有點問題....
不知道版主是否能夠理解
但真的很感謝版主,謝謝。

本篇文章回覆於2018-06-15 10:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
MSSQL是關連式資料庫
關連式資料庫,資料表的設計原則,是想要讓資料表中,減少『重複性』的資料
並且在資料表中,找出一個或多個,能夠代表每一筆資料的『唯一性』的欄位,做為主索引(主KEY)

根據您的描述
MDCONA
欄位有
CONA01,CONA02,CONA03,CONA04

CONA01為主KEY
CONA01資料是來自於
CONA02+CONA03
CONA02為日期EX:20180615
CONA03為編號EX:107001
CONA01就會等於20180615107001


資料表代表唯一性的,可以說是『CONA02+CONA03』
而CONA01,=CONA02+CONA03
算是重複性的資料
如果您的資料已經運作一陣子,就不要去改

如果剛開始設計的話,小喵會設計為

原有的CONA01是重複性的資料,沒必要存放
主索引(主KEY),則是兩個欄位CONA02,CONA03
這樣,SQL在新增資料時,如果有CONA02+CONA03是重複性的資料,自動會違反主索引唯一性,而自動錯誤

-----------------------------
回到您的問題,您想檢查『是否有重複』
誠如您所說,主要不重複的資料應該是『CONA02+CONA03』
那麼,您應該去檢查輸入的資料,對照到這兩個欄位,是否重複
那麼SQL語法應該是



在TXT_CONA04中會輸入編號 EX: 107001
在TXT_CONA02中會輸入日期 EX: 20180615
希望的結果是 在TXT_CONA04中輸入編號後
如果有,就出現資料重複,如果沒有,顯示可新增


小喵做的話,大概會這樣寫

補充幾點如下:
1.用Using宣告,是因為他會在End Using的時候進行自動回收,以免忘了或疏忽,造成資源被抓住不放
2.用個變數來承接,是因為DataReader是『連線型』資料存取,我要判斷只是否有資料,判斷完,應該盡快的釋放掉,把資源放出給其他使用

以上提供參考
^_^
本篇文章回覆於2018-06-15 10:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

阿偉
檢舉此回應




版主
使用後出現
物件型別 System.Web.UI.WebControls.TextBox 與已知的管理提供者原始型別之間並無對應。
錯誤訊息
有檢查欄位資料庫訊息皆是正確,請問要如何處理?
謝謝。
本篇文章回覆於2018-06-15 14:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

阿偉
檢舉此回應
版主
("@CONA02", TXT_CONA02)
("@CONA04", TXT_CONA04)
加上
("@CONA02", TXT_CONA02.text)
("@CONA04", TXT_CONA04.text)
就成功了
感動,謝謝。
本篇文章回覆於2018-06-15 15:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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