how to bind datagridview to database at page load time in vb.net - vb.net

I use below code in try catch block but it gives exception"'table' argument cannot be null. Parameter name: table" .My table name is caste and that table two columns are there srno and castename .But it say that my table has no data.Memory table is a datatable.
Dim Dset As New DataSet()
Dset = New DataSet()
Dset.Tables.Add(MemoryTable)
DataGridView1.DataSource = Dset.Tables("caste")
I tried data connect with database with using datasource but it gives service pack 1 error
'One is to use data binding on your TextBox controls and assigning the same DataSource.but its gives error

You don't show the definition of MemoryTable, but you do say it's a data table. If it's an object of type System.Data.DataTable, then it will have a property called TableName.
When you access a DataTable in a DataSet with a string index value, the value you are passing is the table's TableName property. So Dset.Tables("caste") is looking for a DataTable whose TableName property is set to "caste". If it can't find one, it will return Null. That looks like what's happening.
So set MemoryTable.TableName to "caste" and the error may go away.
I assume that MemoryTable actually has rows in it? If not, that may be a reason why you're getting the message about your table having no data.
So your code should look something like this:
Dim Dset As New DataSet() ' You don't have to do a separate assignment to Dset
' if you use New in the declaration, so we can omit that line.'
MemoryTable.TableName = "caste"
Dset.Tables.Add(MemoryTable)
DataGridView1.DataSource = Dset.Tables("caste")
And, actually, you can use MemoryTable as your data source without having to add it to a DataSet, unless you need to for some other reason.
DataGridView1.DataSource = MemoryTable
I hope this helps.

Related

Problems updating a database using vb.net, oledbdataadapter

After going over multiple questions/answers on Stackoverflow and other boards I'm still lost on why I can't update an Access database from a datatable. I'm trying to take data from a datatable and insert that data into an Access table if it is blank, and replace the table if it already has data. I can successfully replace the table, but the data from the datatable does not get added.
However, the method which I'm using does not appear to work. My datatable comes from a bound datagridsource and the Access layer is called like this:
ConnectedDB.UpdateTable(DBTable, bsDataSource.DataSource)
Where ConnectedDB is the Access Layer class, DBTable is the string containing the Access table name, and bsDataSource is the bound data. As you can see, I passed the .Datasource to turn it into a datatable.
Here is the original (pre-Jan 29th) section of my work to add the datatable back into the Access table:
Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
Dim DS As New DataSet
dgDataTable.TableName = strTable
DS.Tables.Add(dgDataTable)
Using OpenCon = New OleDb.OleDbConnection(strConnectionString)
Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, OpenCon)
Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)
DBcmd.QuotePrefix = "["
DBcmd.QuoteSuffix = "]"
DataAdapter.UpdateCommand = DBcmd.GetUpdateCommand()
Try
OpenCon.Open()
DataAdapter.Fill(DS.Tables(strTable))
If DataAdapter.Update(DS.Tables(strTable)) > 0 Then
Return True
Else Return False
End If
Catch exo As Exception
MessageBox.Show(exo.Message)
Return False
End Try
End Using
End Using
End Function
My function tries to update an existing Access table with the name represented as strTable with the information in the datatable, dgDataTable from a datagridview. Each run hits the update check > 0 and returns a false which means syntax wise it should be working (i.e. no error messages). I have traced the table and it has all the data it should have (so the information is getting passed correctly from the grid through the update commands). I was playing with applying it in a dataset but I'm not sure I really need that.
I was tracing the variables through the update method and I think I found out why it won't update but I'm not sure what to do about it. The query it comes up with is like this:
UPDATE [RtoC] SET [R] = ?, [C] = ?, [Type] = ?, [Unknown] = ? WHERE (([R] = ?) AND ([C] = ?) AND ([Type] = ?) AND ((? = 1 AND [Unknown] IS NULL) OR ([Unknown] = ?)))
The Access table name is RtoC with fields R, C, Type, and unknown.
I'm thinking the "?" are not getting filled in causing the query to just not apply data back to Access. I'm not sure though how to set those items.
EDIT 1/29/20: I used the code changes I and jmcihinney document below and it does insert the lines into the Access table. This edit alters the question to be more specific about what I'm am trying to do, and how the datatable is created. Hopefully this clears up some wording on my part and provides some basis for the alteration of the row state.
The issue is that the Fill method of that data adapter calls AcceptChanges on the DataTable after populating it, thus there are no changes to save when you call Update.
That call to Fill shouldn't be there anyway though, because you don't want to retrieve any data, just save changes. You've got a whole lot of pointless code there. It should look more like this:
Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, strConnectionString)
Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)
DBcmd.QuotePrefix = "["
DBcmd.QuoteSuffix = "]"
Try
Return DataAdapter.Update(dgDataTable) > 0
Catch exo As Exception
MessageBox.Show(exo.Message)
Return False
End Try
End Using
End Function
I took another tack at manipulating the database and in looking that up, I found the answer provided by jmcilhinney back in 2014! [Bulk Insert From DataTable to Access Database
In a for each loop across the rows of my datatable I set this:
row.SetAdded()
If I was filling I would have done something like:
DataAdapter.AcceptChangesDuringFill = True
Before the Fill command.
Unless this method has changed or there is a better way, I'll mark the link as the answer.
Thanks jmcilhinney....twice!

Append data to existing datatable

This is what I presently have
Dim myDataTable As New DataTable
Dim sqlConnection1 As New SqlConnection("myconnectionstring")
Dim cmd As New SqlCommand
Dim reader As SqlDataReader
Dim allSelectedTexts As New List(Of String)
cmd.CommandText = "SELECT * FROM table WHERE parameter=#parameter"
cmd.Parameters.AddWithValue("#parameter", parameter)
cmd.Connection = sqlConnection1
sqlConnection1.Open()
reader = cmd.ExecuteReader()
myDataTable.Load(reader)
sqlConnection1.Close()
lbProduct.DataSource = myDataTable
lbProduct.DataTextField = "product_name"
lbProduct.DataValueField = "product_id"
lbProduct.DataBind()
What I want to do is to query data to add onto this using a new parameter, how would I do that?
I need to get another table and append It onto this one
This is in a multiselect listbox, the first click will get data to add into a datasource, the second click will get other data. I was thinking I could loop through the elements I have selected then add it to the table before I set the datasource, but I don't know how to append to the table
If I understand you correctly, it seems that you just need to know how to append to the datatable before setting the datasource.
You said you wanted to get another table appended to this one. If the schemas are the same (or very similar) you could use the DataTable.Merge method to bring the data together.
Alternatively if your other data is not in the same format, is not in a datatable, or otherwise you would prefer not to use this method, you could use the DataTable.Rows.Add method to write in the data line by line. In this case you would compile your data into an array, such as the following:
myDataTable.Rows.Add(value1, value2, value3, etc...)
Another option might be to bring your other data into another datatable if you wanted to make use of the DataTable.Merge method.
I hope this helps!
DataTable.Merge
DataTable.Rows.Add

Convert string = dataTable variable Name to DataTable type in visual basic

Im using VB.net and I have a variable that contains a string which is the name of another variable. I want to access that variable based off of that string. The scenario goes like this
I am doing a log DataTable with variable name "LogChanges"
Now I have a DataTable variable name "dtbEmployee"
the value "dtbEmployee" will be stored in DataTable "LogChanges" as string
Now
while i loop through the "LogChanges" DataTable and get the "dtbEmployee" in string. Is there a way to use this string to point back to the "dtbEmployee" DataTable
Something like this
For Each dr As DataRow In LogChanges.Select("", "DtbId")
If dr.Item("RecordSeQ") > 0 Then
Dim tempDataTable As DataTable
tempDataTable = "Convert dr.Item("dtbNAme")" to DataTable code
End If
Next
Note: RecordSEQ is just a counter to see how many records have been modified for this table
You would need to store the DataTable against that name somewhere, e.g. the Tables collection of a DataSet or a Dictionary. If the variable is a field and you have the object that has the correct DataTable assigned to that field then you could use Reflection but that would be cumbersome at best. The variable is not the DataTable so you have to some actual relationship to use to get the DataTable via the use of the name.

what is this parameter in these SqlDataAdapter.Fill and DataSet.Tables

I have this part of code:
Dim SqlCommand_customer As New SqlCommand("selectcustomer", conn.con)
SqlCommand_customer.CommandType = CommandType.StoredProcedure
Dim da_customer As New SqlDataAdapter
Dim SqlDataAdapter_customer As New SqlDataAdapter(SqlCommand_customer)
Dim ds_customer = New DataSet()
SqlDataAdapter_customer.Fill(ds_customer, "customer")
DataGridView_customer.DataSource = ds_customer.Tables("customer")
So I want to know what does "customer" stands for in the last two lines
There is nothing named customer in the whole file
and MSDN states that the second parameter in Fill must be of type iDataReader:
dataReader
Type: System.Data.IDataReader
An instance of IDataReader.
The SqlDataAdapter class derives from DbDataAdapter that has a method overload for Fill that takes as second parameter a string.
This string is the name that will be assigned to the table created to store your records or, if you have already tables in the dataset, it is the name of a preexisting table wich will be loaded/refreshed with the records returned by the command.
Of course the syntax in
DataGridView_customer.DataSource = ds_customer.Tables("customer")
is the way in which you reference this table by its name (that would be the same as ds_customer.Tables(0))
The second argument to the fill command is the name of a table.
You are looking at the wrong reference. You want the Fill command off of the SQLDataAdapter.

Fill Datatable using SQL 'select' WITHIN A TRANSACTION

I would like to fill a datatable with results from a SQL select statment but using a transaction. The reason that I am using a transaction is because I have a list of names (as a datatable), and I want to iterate through the list of names and select the database rows where the name = the name on the list. There are 500,000 names in the database and I only want to retreive the relevant rows. I have the code for the procedure as I think it should look like (untested) BUT I dont know HOW to place the data into a datatable .... so Im missing something where I declare the datatable and the 'fill' of that table , could someone help with this ? Or suggest how else I can get the information out of the batabase without looking up each name individually.
Using connection As New SQLite.SQLiteConnection(R2WconectionString)
connection.Open()
Dim sqliteTran As SQLite.SQLiteTransaction = connection.BeginTransaction()
Try
oMainQueryR = "SELECT NameID, Address, Ocupation FROM Employees Where Name= :Name"
Dim cmdSQLite As SQLite.SQLiteCommand = connection.CreateCommand()
With cmdSQLite
.CommandType = CommandType.Text
.CommandText = oMainQueryR
.Parameters.Add(":Name", SqlDbType.VarChar)
End With
'Prevent duplicate selects by using a dictionary
Dim NameInalready As New Dictionary(Of String, String)
For Each row As DataRow In TheLIST.Rows
If NameInalready.ContainsKey(row.Item("Name")) Then
Else
NameInalready.Add(row.Item("Name"), "")
cmdSQLite.Parameters(":Name").Value = row.Item("Name")
cmdSQLite.ExecuteNonQuery()
End If
Next
sqliteTran.Commit()
Catch ex As Exception
End Try
End Using
First, you don't need a transaction because you aren't updating the database.
Second, depending on the possible number of Names in TheLIST, it might be worthwhile for you to change the name selector to IN (i.e. SELECT * FROM Employees WHERE Name IN ('name1', 'name2'). However, if you expect more than about 10, this is probably not worth trouble.
Finally, you need to create a new DataTable to hold the results. Then you need to create a DataAdapter passing cmdSqlLite as the constructor parameter. And finally, replace your ExecuteNonQuery with DataAdapter.Fill(DataTable).
For example (after Dim cmdSQLite):
Dim oDataTable As New DataTable("Employees")
Dim oAdapter As New SqliteDataAdapter(cmdSQLite)
and replacing the ExecuteNonQuery line with:
oAdapter.Fill(oDataTable)
I will qualify this code by saying it may need some tweaks. I only work with class objects and collections, so my preference would have actually been to load a collection of Employee class instances.
I would have done that by replacing ExecuteNonQuery with ExecuteReader and then the loading the read data into a new class instance. This type of approach resolves various issues with serializing the data across service boundaries (i.e. Xml for web services) and also lets you embed business logic, if needed, into the classes.