ขออนุญาติสอบถามเรื่อง Insert into เครื่องหมาย ' single quote ลง ฐานข้อมูล SQL (VB)
ใช้การ Replace ตัว ' เป็น '' (2 ตัว) ครับ เช่น
Code (VB.NET)
Public Function SQLSafe(ByVal str As String)
Return str.Replace("'","''")
End Function
เอา SQLSafe ไปครอบตัวแปร
Date :
2017-02-07 11:27:00
By :
mr.win
แต่แนะนำให้ใช้แบบ Parameter Query แทนครับ
Code (C#)
//*** FOR INSERT ***//
strSQL = "INSERT INTO customer (CustomerID,Name,Email,CountryCode,Budget,Used) " +
"VALUES (@sCustomerID,@sName,@sEmail,@sCountryCode,@sBudget,@sUsed)";
objCmd = new System.Data.SqlClient.SqlCommand(strSQL,objConn);
//*** Sample 1 ***//
/*
objCmd.Parameters.AddWithValue("@sCustomerID","C005");
objCmd.Parameters.AddWithValue("@sName","Weerachai Nukitram");
objCmd.Parameters.AddWithValue("@sEmail","[email protected] ");
objCmd.Parameters.AddWithValue("@sCountryCode","TH");
objCmd.Parameters.AddWithValue("@sBudget","2000000");
objCmd.Parameters.AddWithValue("@sUsed","1000000");
*/
//*** Sample 2 ***//
objCmd.Parameters.Add(new SqlParameter("@sCustomerID","C005"));
objCmd.Parameters.Add(new SqlParameter("@sName","Weerachai Nukitram"));
objCmd.Parameters.Add(new SqlParameter("@sEmail","[email protected] "));
objCmd.Parameters.Add(new SqlParameter("@sCountryCode","TH"));
objCmd.Parameters.Add(new SqlParameter("@sBudget","2000000"));
objCmd.Parameters.Add(new SqlParameter("@sUsed","1000000"));
objCmd.ExecuteNonQuery();
(C#) ASP.NET System.Data.SqlClient - Parameter Query (SqlParameter)
Date :
2017-02-07 11:28:51
By :
mr.win
ใช้แบบ Parameters จะดีและปลอดภัยกว่าเยอะเลยนะครับ
Date :
2017-02-07 13:43:38
By :
mr.win
ผมใช้แบบ Replace '' เอาครับ
ความเห็นส่วนตัวว่า ใช้แบบ parameter มันลำบาก
เพราะมันต้องพิมพ์เยอะ ถ้าส่งค่าสัก 20 ตัว ก็พิมพ์กันเยอะเลย
และผมก็ไม่เคยจำคำสั่งได้เลย จะพิมพ์ที ก็เปิดหาที T_T
ส่วนเรื่อง พศ คศ ปกติจะสั่งชุดคำสั่งที่ทำให้โปรแกรมเราเป็น คศ ก่อนเสมอครับ
Date :
2017-02-08 07:49:25
By :
fonfire
เหมือนการจัดการ database จะผลักให้มีการจัดการในรูปของ list ให้มากขึ้นรึป่าวครับ
แทนที่เราจะใช้ for แบบบ้านๆ สำหรับจัดการ ก็ดึงเอาพวก binding เข้ามาช่วย
ยิ่ง entity ด้วยยิ่งออกแนว object ไปเลย
แล้วตัว Parameter น่าจะโผล่ขึ้นมาตอบโจทย์ เจ้าพวก data type รึป่าวครับ
เพราะเห็นบางคน จัดการ database แล้วจะติดเรื่อง datatype ไม่ตรง
แต่ถ้าเป็น Parameter
Code (C#)
this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
this._adapter.InsertCommand.Connection = this.Connection;
this._adapter.InsertCommand.CommandText = "INSERT INTO [dbo].[PostCode_Amphur] ([Post_Amphur], [Post_Amphur_Eng]) VALUES (@P" +
"ost_Amphur, @Post_Amphur_Eng);\r\nSELECT Post_Amphur_ID, Post_Amphur, Post_Amphur_" +
"Eng FROM PostCode_Amphur WHERE (Post_Amphur_ID = SCOPE_IDENTITY())";
this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Post_Amphur", global::System.Data.SqlDbType.VarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Post_Amphur", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Post_Amphur_Eng", global::System.Data.SqlDbType.VarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Post_Amphur_Eng", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
ถ้าเป็นแบบนี้ก็จะตัดปัญหาเรื่อง input datatype ไม่ตรง ได้
แต่โดยส่วนตัวงานผม(ซึ่งก็ต้องเอ่ยว่า ไม่คล่องกับ SQL)จะเน้นเป็นแบบ datagrid ซึ่งก็จะเหมาะกับ dataset
ยกตัวอย่างถ้าเราอยากลบ data ซัก 2000 rows ถ้าผมใช้ SQL ก็ต้องใช้ for loop วนลบจนครบ
(แต่ถ้า เราไม่ได้ลบ ID ต่อกันละ)
แล้วถ้า การจัดการมีทั้ง Insert update delete rows ผมเคยลองจัดการดู(ขอบอกว่าเละ)
ถ้า dataset ก็แค่ เช็คการจัดการใน ตาราง แล้วก็ Update ตารางใหม่
Code (C#)
private int UpdateUpdatedRows(DATA_ALSDataSet dataSet, global::System.Collections.Generic.List<global::System.Data.DataRow> allChangedRows, global::System.Collections.Generic.List<global::System.Data.DataRow> allAddedRows) {
int result = 0;
if ((this._postCode_AmphurTableAdapter != null)) {
global::System.Data.DataRow[] updatedRows = dataSet.PostCode_Amphur.Select(null, null, global::System.Data.DataViewRowState.ModifiedCurrent);
updatedRows = this.GetRealUpdatedRows(updatedRows, allAddedRows);
if (((updatedRows != null)
&& (0 < updatedRows.Length))) {
result = (result + this._postCode_AmphurTableAdapter.Update(updatedRows));
allChangedRows.AddRange(updatedRows);
}
}
return result;
}
แต่ dataset ก็ยังมีข้อเสียอยู่เหมือนกัน เรียกใช้งานช้า จึงไม่น่าเหมาะสำหรับที่ใช้กับคนหมู่มาก(ของผมใช้แค่ 10 กว่าคนเอง)
Date :
2017-02-08 08:47:57
By :
lamaka.tor
กรณีที่เป็น DataType จะต้องระบุเข้าไปด้วยครับ ตัวอย่าง
Code (VB.NET)
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database.mdb"
objConn.ConnectionString = strConnString
objConn.Open()
'*** Insert to orders ***'
strSQL = "INSERT INTO orders (OrderDate,Name,Address,Tel,Email) " & _
" VALUES " & _
" (@sOrderDate,@sName,@sAddress,@sTel,@sEmail)"
Dim objCmd As New OleDbCommand(strSQL, objConn)
objCmd.Parameters.Add("@sOrderDate", OleDbType.Date).Value = Now()
objCmd.Parameters.Add("@sName", OleDbType.VarChar).Value = Me.txtName.Text
objCmd.Parameters.Add("@sAddress", OleDbType.VarChar).Value = Me.txtAddress.Text
objCmd.Parameters.Add("@sTel", OleDbType.VarChar).Value = Me.txtTel.Text
objCmd.Parameters.Add("@sEmail", OleDbType.VarChar).Value = Me.txtEmail.Text
objCmd.ExecuteNonQuery()
'*** Select OrderID ***'
strSQL = "SELECT Max(OrderID) As sOrderID FROM orders "
dtAdapter = New OleDbDataAdapter(strSQL.ToString(), objConn)
dtAdapter.Fill(dt1)
If dt1.Rows.Count > 0 Then
strOrderID = dt1.Rows(0)("sOrderID")
End If
'*** Insert to orders_detail ***'
dt2 = DirectCast(Session("myCart"), DataTable)
For i = 0 To dt2.Rows.Count - 1
strSQL = "INSERT INTO orders_detail (OrderID,ProductID,Qty) " & _
" VALUES " & _
" ('" & strOrderID & "','" & dt2.Rows(i)("ProductID") & "','" & dt2.Rows(i)("Qty") & "')"
With objCmd
.Connection = objConn
.CommandText = strSQL
.CommandType = CommandType.Text
.ExecuteNonQuery()
End With
Next
objConn.Close()
objConn = Nothing
Date :
2017-02-08 10:22:33
By :
mr.win
Load balance : Server 03