第10章ADO與資料庫存取(二)

Download Report

Transcript 第10章ADO與資料庫存取(二)

第10章
ADO與資料庫存取(二)
M9153317 朱永方
本章摘要
本章介紹將資料庫內容的新增、修改與刪除
 10-1 Command物件與資料的增刪修改
 10-2 DataGrid 與資料的修改
 10-3 DataSet 物件與XML的讀寫
 10-4 存取SQL Server 資料庫
Command物件與資料的增刪修改
Action Query指令
能夠寫入資料的指令


刪除資料列:Delete
Delete From 成績單 where 數學 = 0

更新資料列:Update
Update 成績單 Set 數學 = 數學 ^ 0.5 * 10

新增資料列:Insert Into
Insert Into 成績單 (學號,姓名,國文) Values (80030, “小明”, 80)

建立新資料表:Select Into
Select * Into 數學高手 from 成績單 where 數學 >= 90
Command物件與資料的增刪修改

含有參數的SQL指令(P.446)

按下[新增]按鈕時,將輸入資料寫入資料庫中
Command物件與資料的增刪修改

含有參數的SQL指令
建立輸入資料的文字方塊
學號: <asp:TextBox runat="server" id="學號" /><br>
姓名: <asp:TextBox runat="server" id="姓名" /><br>
國文: <asp:TextBox runat="server" id="國文" /><br>
英文: <asp:TextBox runat="server" id="英文" /><br>
數學: <asp:TextBox runat="server" id="數學" /><p>
Command物件與資料的增刪修改

含有參數的SQL指令
含有參數的SQL指令
SQL = "Insert Into 成績單 (學號, 姓名, 國文, 英文, 數學 )
Values( ?, ?, ?, ?, ?)"
Command物件與資料的增刪修改

含有參數的SQL指令
設定參數資料寫入mdb資料庫時之資料型別
Cmd.Parameters.Add( New OleDbParameter("學號", OleDbType.Integer))
Cmd.Parameters.Add( New OleDbParameter("姓名", OleDbType.Char, 10))
Cmd.Parameters.Add( New OleDbParameter("國文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("英文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("數學", OleDbType.SmallInt))
Integer:長整數
Char:字元,數字為字元長度
SmallInt:整數
Command物件與資料的增刪修改

含有參數的SQL指令
使用Cmd.parameters( ).Value 設定參數資料內容
Cmd.Parameters("學號").Value = Val(學號.Text)
Cmd.Parameters("姓名").Value = 姓名.Text
Cmd.Parameters("國文").Value = Val(國文.Text)
Cmd.Parameters("英文").Value = Val(英文.Text)
Cmd.Parameters("數學").Value = Val(數學.Text)
呼叫Val函數將TextBox資料轉換成數值
Command物件與資料的增刪修改

含有參數的SQL指令--使用具名的參數(p.451)
SQL = "Insert Into 成績單 (學號, 姓名, 國文, 英文, 數學 ) Values( @學號, @姓
名, @國文, @英文, @數學)“
Cmd = New OleDbCommand( SQL, Conn )
Cmd.Parameters.Add( New OleDbParameter("@學號", OleDbType.Integer))
Cmd.Parameters.Add( New OleDbParameter("@姓名", OleDbType.Char, 10))
Cmd.Parameters.Add( New OleDbParameter("@國文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("@英文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("@數學", OleDbType.SmallInt))
Cmd.Parameters("@學號").Value = Val(學號.Text)
Cmd.Parameters("@姓名").Value = 姓名.Text
Cmd.Parameters("@國文").Value = Val(國文.Text)
Cmd.Parameters("@英文").Value = Val(英文.Text)
Cmd.Parameters("@數學").Value = Val(數學.Text)
DataGrid 與資料的修改

DataGrid的安插(p.454)
<Columns>
<asp:EditCommandColumn
HeaderText="修改" ItemStyle-Wrap="False
EditText="編輯" UpdateText="更新" CancelText="取消" />
</Columns>
DataGrid 與資料的修改

DataGrid的安插(p.454)
<Columns>
<asp:EditCommandColumn
HeaderText="修改" ItemStyle-Wrap="False
EditText="編輯" UpdateText="更新" CancelText="取消" />
</Columns>
DataGrid 與資料的修改

事件程序編寫(p.456)
OnEditCommand="EditData"
OnUpdateCommand="UpdateData“
OnCancelCommand="CancelEdit“
DataKeyField="學號“
Sub EditData(sender As Object, e As DataGridCommandEventArgs)
MyGrid.EditItemIndex = e.Item.ItemIndex
OpenDataBase_And_BindToDataGrid()
End Sub
Sub CancelEdit(sender As Object, e As DataGridCommandEventArgs)
MyGrid.EditItemIndex = -1
OpenDataBase_And_BindToDataGrid()
End Sub
DataGrid 與資料的修改

事件程序編寫--更新資料(p.462)
OnEditCommand="EditData"
OnUpdateCommand="UpdateData“
OnCancelCommand="CancelEdit“
DataKeyField="學號“
Sub UpdateData(sender As Object, e As DataGridCommandEventArgs)
………
SQL = "Update 成績單 Set 學號=@學號, 姓名=@姓名, 國文=@國文, 英文=@英文, 數學=@數學 Where 學號
=@Key"
Cmd = New OleDbCommand( SQL, Conn )
Cmd.Parameters.Add( New OleDbParameter("@學號", OleDbType.Integer))
……..
Dim TB(5) As TextBox
TB(1) = e.Item.Cells(1).Controls(0) ' 學號 TextBox
……..
Cmd.Parameters("@Key").Value = MyGrid.DataKeys(e.Item.ItemIndex)
Cmd.Parameters("@學號").Value = Val(TB(1).Text)
Cmd.Parameters("@姓名").Value = TB(2).Text
…….
Cmd.ExecuteNonQuery()
Conn.Close()
MyGrid.EditItemIndex = -1
OpenDataBase_And_BindToDataGrid()
End Sub
DataGrid 與資料的修改

設定不可修改的欄位(p.464) 將學號欄位設定為不可修改
OnEditCommand="EditData"
OnUpdateCommand="UpdateData"
OnCancelCommand="CancelEdit"
DataKeyField="學號"
AutoGenerateColumns="False" >
<Columns>
<asp:EditCommandColumn
HeaderText="修改" ItemStyle-Wrap="False"
EditText="編輯" UpdateText="更新" CancelText="取消" />
<asp:BoundColumn DataField="學號" HeaderText="學號"
ReadOnly="True" />
<asp:BoundColumn DataField="姓名" HeaderText="姓名"/>
<asp:BoundColumn DataField="國文" HeaderText="國文"/>
<asp:BoundColumn DataField="英文" HeaderText="英文"/>
<asp:BoundColumn DataField="數學" HeaderText="數學"/>
</Columns>
DataGrid 與資料的修改

設定ListBox及CheckBox欄位

使用TemplateColumn欄位
<asp:BoundColumn DataField="姓名" HeaderText="姓名"/>
<asp:TemplateColumn HeaderText="姓名"/>
<ItemTemplate>
<asp:Label runat="server"
Text='<%# Container.DataItem("姓名") %>'/>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" id="姓名" Size=10
Text='<%# Container.DataItem("姓名") %>'/>
</EditItemTemplate>
</asp:TemplateColumn>
DataGrid 與資料的修改

設定ListBox及CheckBox欄位

使用CheckBox ( p.472)
<asp:TemplateColumn HeaderText="已婚">
<ItemTemplate>
<asp:Label runat="server"
Text='<%# Container.DataItem("已婚") %>'/>
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox runat="server" id="已婚"
Checked='<%# Container.DataItem("已婚") %>'/>
</EditItemTemplate>
</asp:TemplateColumn>
DataGrid 與資料的修改

設定ListBox及CheckBox欄位

使用ListBox ( p.473)
<asp:TemplateColumn HeaderText="性別">
<ItemTemplate>
Function 性別編號( 性別 As String ) As Integer
<asp:Label runat="server"
If 性別 = "男" Then%>'/>
Return 0
Text='<%# Container.DataItem("性別")
If 性別 = "女" Then Return 1
</ItemTemplate>
End Function
<EditItemTemplate>
<asp:ListBox runat="server" id="性別" Rows=1
SelectedIndex='<%# 性別編號(Container.DataItem("性別")) %>'>
<asp:ListItem>男</asp:ListItem>
<asp:ListItem>女</asp:ListItem>
</asp:ListBox>
</EditItemTemplate>
</asp:TemplateColumn>
DataGrid 與資料的修改

更新資料庫資料

使用FindControl 找到相關欄位之控制元件( p.474)
Dim Text姓名 As TextBox
Text姓名 = e.Item.FindControl("姓名")
Cmd.Parameters("@姓名").Value = Text姓名.Text
Dim List性別 As ListBox
List性別 = e.Item.FindControl("性別")
Cmd.Parameters("@性別").Value = List性別.SelectedItem.Text
Dim List血型 As ListBox
List血型 = e.Item.FindControl("血型")
Cmd.Parameters("@血型").Value = List血型.SelectedItem.Text
Dim Check已婚 As CheckBox
Check已婚 = e.Item.FindControl("已婚")
Cmd.Parameters("@已婚").Value = Check已婚.Checked
DataSet物件與XML的讀寫

XML檔案的讀取( p.481)
使用DataSet物件的ReadXml方法
Sub Page_Load(sender As Object, e As EventArgs)
Dim Ds As New DataSet
Ds.ReadXml( Server.MapPath("Score.xml") )
MyGrid.DataSource = Ds.Tables( "成績單" ).DefaultView
MyGrid.DataBind()
End Sub
DataSet物件與XML的讀寫

將mdb資料庫轉換成XML檔案( p.484)
使用DataSet物件的WriteXml方法
Dim SQL = "Select * From 成績單"
Adpt = New OleDbDataAdapter( SQL, Conn )
Ds = New Dataset()
Adpt.Fill(Ds, "成績單")
Ds.WriteXml( Server.MapPath("Score2.xml"), XmlWriteMode.WriteSchema )
存取SQL Server資料庫

從OleDb到SqlClient

由使用mdb資料庫轉換為使用SQL Server
<%@ Import Namespace="System.Data.OleDb" %>
改為
<%@ Import Namespace="System.Data.SqlClient" %>
 Dim Conn As OleDbConnection
Dim Adpt As OleDbDataAdapter
改為
Dim Conn As SqlConnection
Dim Adpt As SqlDataAdapter

存取SQL Server資料庫

從OleDb到SqlClient

由使用mdb資料庫轉換為使用SQL Server

Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
Dim Database = "Data Source=" &
Server.MapPath( "Sample.mdb" )
Conn = New OleDbConnection( Provider & ";" & DataBase )
Conn.Open()
改為
Conn = New SqlConnection( “server=(local)\NetSDK;” &
“database=pubs;” & “Trusted_Connection=Yes” )
Conn.Open()
存取SQL Server資料庫

從OleDb到SqlClient

由使用mdb資料庫轉換為使用SQL Server
 Dim SQL = "Select * From 成績單"
Adpt = New OleDbDataAdapter( SQL, Conn )
改為
Dim SQL = "Select * From 成績單"
Adpt = New SqlDataAdapter( SQL, Conn )
存取SQL Server資料庫

從OleDb到SqlClient

由使用mdb資料庫轉換為使用SQL Server

Cmd.Parameters.Add( New OleDbParameter("@學號", OleDbType.Integer))
Cmd.Parameters.Add( New OleDbParameter("@姓名", OleDbType.Char, 10))
Cmd.Parameters.Add( New OleDbParameter("@國文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("@英文", OleDbType.SmallInt))
Cmd.Parameters.Add( New OleDbParameter("@數學", OleDbType.SmallInt))
改為
Cmd.Parameters.Add( New SqlParameter("@學號", OleDbType.Int))
Cmd.Parameters.Add( New SqlParameter("@姓名", OleDbType.Char, 10))
Cmd.Parameters.Add( New SqlParameter("@國文", OleDbType.SmallInt))
Cmd.Parameters.Add( New SqlParameter("@英文", OleDbType.SmallInt))
Cmd.Parameters.Add( New SqlParameter("@數學", OleDbType.SmallInt))