mutanic
Super Active Member
- Messages
- 5,538
- Joined
- May 24, 2009
- Messages
- 5,538
- Reaction score
- 213
- Points
- 73
amekawwww...sekali masta post...mantap bro...mmg boleh jadi lecturer ni...
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Untuk VB... untuk asas INSERT kedalam SQL, boleh cuba guna kaedah ini.. :
Code:Dim con As New SqlConnection Dim cmd As New SqlCommand con.ConnectionString = "connection string anda" cmd.Connection = con cmd.CommandText = "INSERT INTO Transaction(amount,date ) VALUES(@amount, @date)" sqlComm.Parameters.AddWithValue("@amount", tbAmount.Text) sqlComm.Parameters.AddWithValue("@date", tbDate.Value) Try con.Open() cmd.ExecuteNonQuery() con.Close() Catch ex As SqlExecption MessageBox.Show("Gagal masukkan kedalam table.." & ex.Message, "Insert Records") Finally End Try
Tapi dari pemerhatian saya dari code bro, bro cuba nak masukkan data mengunakan Data Grid View...
Dan sebab itu bro buat foreach dalam data grid view untuk masukkan semua record kedalam table transaction..
Betul?
Jadi apa yang saya boleh cadangkan, bro boleh cuba cara seperti ini...
Code:For i = 0 To DGV2.Rows.Count - 1 Dim con As New SqlConnection Dim cmd As New SqlCommand con.ConnectionString = "connection string anda" cmd.Connection = con cmd.CommandText = "INSERT INTO Transaction(amount,date ) VALUES(@amount, @date)" 'Merujuk kepada column pertama dalam datagrid iaitu amount sqlComm.Parameters.AddWithValue("@amount", Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString())) 'Merujuk kepada column dalam datagrid kedua iaitu tarikh sqlComm.Parameters.AddWithValue("@date", DateTime.Parse(DGV2.Rows[i].Cells[1].Value.ToString())) Try con.Open() cmd.ExecuteNonQuery() con.Close() Catch ex As SqlException MessageBox.Show("Gagal masukkan kedalam table.." & ex.Message, "Insert Records") Finally con.Dispose() End Try
Jadi bro faham apa saya cuba explain? Kita lihat disini DGV2.Rows.Cells[0].Value.ToString()
Ianya bermaksud kita dapatkan nilai daripada pada baris pertama .Rows[1] dan juga cell daripada column pertama iaitu .Cells[0]..
Jadi, setiap kali bro buat foreach, i atau pun kita panggil Index akan menaik..Dan proses akan menjadi seperti ini
DGV2.Rows[1].Cells[0].Value.ToString()
DGV2.Rows[2].Cells[0].Value.ToString()
DGV2.Rows[3].Cells[0].Value.ToString()
'dan seterusnya
Sampai habis foreach, i tadi akan stop pada nilai terakhir...Iaitu pada akhir row data grid..
Yang kedua, yup bro memang bagus sebab pakai parameter. Jadi bro mesti tahu apa kelebihan mengunakan parameter.. betul?
Kebiasaanya, dalam table transaction data type amount akan pakai jenis "Decimal" dan data type date pula akan pakai jenis "DateTime"... betul?
Jadi apa kesilapan bro buat, bro tidak parse value dari datagrid ke parameter, sebab itu dia akan keluar error "conversion from type dbnull to long is not valid"....
Jadi untuk elakkan error seperti itu, bro kena tambah Decimal.Parse atau DateTime.TryParse...
Contohnya seperti ini :
Code:'Parse dari string ke decimal Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString()) 'Parse dari string ke datetime DateTime.Parse(DGV2.Rows[i].Cells[1].Value.ToString()) 'Dan contohnya ada data type jenis Int boleh la wat gini int.Parse(DGV2.Rows[i].Cells[3].Value.ToString())
Jadi harap bro paham penerangan saya..., sorry kalau ada error.. VB dah tak igt sangat... huhuhu
Happy programming....![]()

Untuk VB... untuk asas INSERT kedalam SQL, boleh cuba guna kaedah ini.. :
Code:Dim con As New SqlConnection Dim cmd As New SqlCommand con.ConnectionString = "connection string anda" cmd.Connection = con cmd.CommandText = "INSERT INTO Transaction(amount,date ) VALUES(@amount, @date)" sqlComm.Parameters.AddWithValue("@amount", tbAmount.Text) sqlComm.Parameters.AddWithValue("@date", tbDate.Value) Try con.Open() cmd.ExecuteNonQuery() con.Close() Catch ex As SqlExecption MessageBox.Show("Gagal masukkan kedalam table.." & ex.Message, "Insert Records") Finally End Try
Tapi dari pemerhatian saya dari code bro, bro cuba nak masukkan data mengunakan Data Grid View...
Dan sebab itu bro buat foreach dalam data grid view untuk masukkan semua record kedalam table transaction..
Betul?
Jadi apa yang saya boleh cadangkan, bro boleh cuba cara seperti ini...
Code:For i = 0 To DGV2.Rows.Count - 1 Dim con As New SqlConnection Dim cmd As New SqlCommand con.ConnectionString = "connection string anda" cmd.Connection = con cmd.CommandText = "INSERT INTO Transaction(amount,date ) VALUES(@amount, @date)" 'Merujuk kepada column pertama dalam datagrid iaitu amount sqlComm.Parameters.AddWithValue("@amount", Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString())) 'Merujuk kepada column dalam datagrid kedua iaitu tarikh sqlComm.Parameters.AddWithValue("@date", DateTime.Parse(DGV2.Rows[i].Cells[1].Value.ToString())) Try con.Open() cmd.ExecuteNonQuery() con.Close() Catch ex As SqlException MessageBox.Show("Gagal masukkan kedalam table.." & ex.Message, "Insert Records") Finally con.Dispose() End Try
Jadi bro faham apa saya cuba explain? Kita lihat disini DGV2.Rows.Cells[0].Value.ToString()
Ianya bermaksud kita dapatkan nilai daripada pada baris pertama .Rows[1] dan juga cell daripada column pertama iaitu .Cells[0]..
Jadi, setiap kali bro buat foreach, i atau pun kita panggil Index akan menaik..Dan proses akan menjadi seperti ini
DGV2.Rows[1].Cells[0].Value.ToString()
DGV2.Rows[2].Cells[0].Value.ToString()
DGV2.Rows[3].Cells[0].Value.ToString()
'dan seterusnya
Sampai habis foreach, i tadi akan stop pada nilai terakhir...Iaitu pada akhir row data grid..
Yang kedua, yup bro memang bagus sebab pakai parameter. Jadi bro mesti tahu apa kelebihan mengunakan parameter.. betul?
Kebiasaanya, dalam table transaction data type amount akan pakai jenis "Decimal" dan data type date pula akan pakai jenis "DateTime"... betul?
Jadi apa kesilapan bro buat, bro tidak parse value dari datagrid ke parameter, sebab itu dia akan keluar error "conversion from type dbnull to long is not valid"....
Jadi untuk elakkan error seperti itu, bro kena tambah Decimal.Parse atau DateTime.TryParse...
Contohnya seperti ini :
Code:'Parse dari string ke decimal Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString()) 'Parse dari string ke datetime DateTime.Parse(DGV2.Rows[i].Cells[1].Value.ToString()) 'Dan contohnya ada data type jenis Int boleh la wat gini int.Parse(DGV2.Rows[i].Cells[3].Value.ToString())
Jadi harap bro paham penerangan saya..., sorry kalau ada error.. VB dah tak igt sangat... huhuhu
Happy programming....![]()
amekawwww...sekali masta post...mantap bro...mmg boleh jadi lecturer ni...
bro, ada masalah x kalu null?
contoh kat sini : DGV2.Rows.Cells[0].Value.ToString()
kot kalu null process akan skip & continue sampai abis ka atau stop sbb xleh pass null value...ada kemungkinan x?:-?
why not wat checking dulu & pass value ke pembolehubah jer, kalu null maka pembolehubah hold something mcm 0 or 0.00 ka baru masuk parameter...
if(DGV2.Rows[i].Cells[0].Value.ToString() != null)
sqlComm.Parameters.AddWithValue("@amount", Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString()))
else
// Letak nilai apa sepatutnya, atau letak sebagai null pun buleh..
sqlComm.Parameters.AddWithValue("@amount",DBNull.Value)
Ok bro.. sejujurnya saya tak faham kenapa bro nak amik value no transaction daripada last ID, kemudian dimasukkan semula kedalam table transaction.. Boleh bro terangkan kepada saya?owh..yang neh aku dah nampak dah.
aku cuba coding neh malam atau esok..
kalau ok aku update, tak ok pown aku update..haha
aku rasa problem pada autonumber.
NoTransaction tue aku buat auto number.
so bila nak tambah data baru, aku SELECT MAX dari autonumber tue.
rasanyalah.
Dim dt as new DataTable
Dim adapter as new SqlDataAdapter("SELECT TOP 1 noTransaction FROM Transaction ORDER BY noTransaction DESC;", sqlconn.connectionstring)
adapter.fill(dt)
'Check dulu sekiranya sql return semula nilai.. Kalau ada nilai akan pass value ke variable ID
If dt.Rows.Count > 0 Then
'Dalam datatable, id asalnya didalam bentuk string. Jadi kena convert dalam bentuk Integer..
int id = int.Parse(dt.Rows[0]["noTransaction"].ToString())
End If

Ok bro.. sejujurnya saya tak faham kenapa bro nak amik value no transaction daripada last ID, kemudian dimasukkan semula kedalam table transaction.. Boleh bro terangkan kepada saya?
"NoTransaction tue aku buat auto number."
Kalau tak salah saya, auto number adalah no increment..Didalam SQL management studio sendiri boleh set id table kepada nombor increment.. Ya, saya setuju dengan bro kalau melibatkan transaction memang kita pakai auto number... Takkan kita nak letak nilai satu-satu rekod kan? hehe
Kita memang tahu, id untuk transaction adalah unique. Bermaksud tidak boleh ada value yang sama dalam sesuatu table.Andai kata pun, sekiranya bro dapat ambil ID pada rekod terakhir dan masukkan semula kedalam table ianya akan tetap error pada sql server...
Biasanya, selepas kita insert sahaja rekod kedalam table. Automatik value id akan menaik... Jadi tak perlu insert sekali ID kedalam table transaction.. Sebab itu bukan lagi tugas bro untuk masukkan ID sekali...
Sekiranya bro tetap berdegil untuk meneruskan perjuangan bro. Bro boleh pakai kaedah Data Table.... Dan ada pelbagai jenis SQL untuk dapatkan ID terakhir didalam sesuatu table.. Lebih ringkas daripada guna Execute scalar..
Contoh MS SQL =
-"SELECT noTransaction FROM Transaction WHERE noTransaction = IDENT_CURRENT('Transaction');"
- "SELECT TOP 1 noTransaction FROM Transaction ORDER BY noTransaction DESC;"
-"SELECT MAX(noTransaction) as lastID FROM Transaction;"
Jadi bro boleh pilih je mana-mana yang sesuai.. Kalau saya, prefer pada no 1 atau 2...
Contohnya :
Code:Dim dt as new DataTable Dim adapter as new SqlDataAdapter("SELECT TOP 1 noTransaction FROM Transaction ORDER BY noTransaction DESC;", sqlconn.connectionstring) adapter.fill(dt) 'Check dulu sekiranya sql return semula nilai.. Kalau ada nilai akan pass value ke variable ID If dt.Rows.Count > 0 Then 'Dalam datatable, id asalnya didalam bentuk string. Jadi kena convert dalam bentuk Integer.. int id = int.Parse(dt.Rows[0]["noTransaction"].ToString()) End If
Happy Programming....![]()
Thanks bro.. ilmu boleh kongsi.. Insyallah mana tahu saya cuba tolong....
OK, merujuk kepada pertanyaan bro, Sekiranya dalam datagrid bro takda nilai atau dipanggil sebagai NULL, looping akan error sebab takleh parse format kepada seperti datetime.. Kalau tak silap saya lah..
Jadi apa yang kita boleh, kita kena check terlebih dahulu, contohnya...
Code:if(DGV2.Rows[i].Cells[0].Value.ToString() != null) sqlComm.Parameters.AddWithValue("@amount", Decimal.Parse(DGV2.Rows[i].Cells[0].Value.ToString())) else // Letak nilai apa sepatutnya, atau letak sebagai null pun buleh.. sqlComm.Parameters.AddWithValue("@amount",DBNull.Value)
Sorry bro, contoh tadi untuk basic sahaja.. Dan sebetulnya, memang kita perlu check terlebih dahulu value didalam datagrid untuk elak sistem throw exception....
Harap faham penerangan saya...![]()
Ok bro.. sejujurnya saya tak faham kenapa bro nak amik value no transaction daripada last ID, kemudian dimasukkan semula kedalam table transaction.. Boleh bro terangkan kepada saya?
"NoTransaction tue aku buat auto number."
Kalau tak salah saya, auto number adalah no increment..Didalam SQL management studio sendiri boleh set id table kepada nombor increment.. Ya, saya setuju dengan bro kalau melibatkan transaction memang kita pakai auto number... Takkan kita nak letak nilai satu-satu rekod kan? hehe
Kita memang tahu, id untuk transaction adalah unique. Bermaksud tidak boleh ada value yang sama dalam sesuatu table.Andai kata pun, sekiranya bro dapat ambil ID pada rekod terakhir dan masukkan semula kedalam table ianya akan tetap error pada sql server...
Biasanya, selepas kita insert sahaja rekod kedalam table. Automatik value id akan menaik... Jadi tak perlu insert sekali ID kedalam table transaction.. Sebab itu bukan lagi tugas bro untuk masukkan ID sekali...
Sekiranya bro tetap berdegil untuk meneruskan perjuangan bro. Bro boleh pakai kaedah Data Table.... Dan ada pelbagai jenis SQL untuk dapatkan ID terakhir didalam sesuatu table.. Lebih ringkas daripada guna Execute scalar..
Contoh MS SQL =
-"SELECT noTransaction FROM Transaction WHERE noTransaction = IDENT_CURRENT('Transaction');"
- "SELECT TOP 1 noTransaction FROM Transaction ORDER BY noTransaction DESC;"
-"SELECT MAX(noTransaction) as lastID FROM Transaction;"
Jadi bro boleh pilih je mana-mana yang sesuai.. Kalau saya, prefer pada no 1 atau 2...
Contohnya :
Code:Dim dt as new DataTable Dim adapter as new SqlDataAdapter("SELECT TOP 1 noTransaction FROM Transaction ORDER BY noTransaction DESC;", sqlconn.connectionstring) adapter.fill(dt) 'Check dulu sekiranya sql return semula nilai.. Kalau ada nilai akan pass value ke variable ID If dt.Rows.Count > 0 Then 'Dalam datatable, id asalnya didalam bentuk string. Jadi kena convert dalam bentuk Integer.. int id = int.Parse(dt.Rows[0]["noTransaction"].ToString()) End If
Happy Programming....![]()
owh..well clearly thats my false.
aku copy code tue dari sumber internet, lepas tue aku edit supaya ngam dengan form aku.
last2 error.
apa yang aku cuba buat ialah, aku akan masukkan detail dari form example dari "textbox" dan jugak "datagridview".
then dari situ bila aku tekan satu button, contohnya "save"..detail dari "textbox" dan "datagridview" tue akan masuk ke dalam database aku yang mengandungi
NoTransaction = AutoNumber
NoProduct = Number
TotalPrice = Currency
Quantity = Number
Date = Date/Time
so agak2 bro, apa method dan coding yang sesuai.