[VB.NET] rij toevoegen in dataset

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Grrrrr. Ik probeer nu om een nieuwe datarow toe te voegen in mijn dataset. Heb tot nu toe alleen gewerkt met kant en klare XML files, dat was geen probleem.
Ik dacht dat dit ook heel makkelijk was, maar toch lukt het me niet....

heb het eerst geprobeerd met een commandBuilder, en met de da.Update methode, maar ik kreeg (af en toe) de foutmelding: NO_DATA no error information available

Heb hierop gegoogled en kwam iets tegen dat erg veel op een bug leek. Omdat het een standaard procedure is heb ik het nu anders geprobeerd:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim strConnection As String = ConfigurationSettings.AppSettings("ConnString")
Dim cnn As New OdbcConnection(strConnection)
Dim da As New OdbcDataAdapter
Dim cmdSelect As New OdbcCommand
Dim cmdInsert As New OdbcCommand
Dim param As OdbcParameter
Dim dsServer As New DataSet 

'Grab initial data
cmdSelect = cnn.CreateCommand
cmdSelect.CommandText = "SELECT * FROM iTransaction"
da.SelectCommand = cmdSelect

cmdInsert = cnn.CreateCommand
cmdInsert.CommandText = "INSERT INTO iTransaction VALUES (@CmpId, @UsrId)"

param = cmdInsert.Parameters.Add("@CmpId", OdbcType.Char, 6, "aaa333")
param = cmdInsert.Parameters.Add("@UsrId", OdbcType.Char, 4, "xxxx")

da.Fill(dsServer, "iTransaction")


Wat klopt er niet aan de methode? moet ik eerst kolommen(types) toevoegen?
Moet ik rekening houden met het AutoNumber (=PK) veld? Die heb ik nu niet als parameter toegevoegd. :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Hoe ziet het Sql statement van je insert command er uit ?

Als je een nieuwe row wilt toevoegen aan je DB, dan moet je de ExecuteNonQuery method aarnoepen van je Command object.
De Update method van de data-adapter kan je ook gebruiken, maar dan moet je een dataset meegeven met daarin de te wijzigen records. Je DataAdapter moet dan ook geldige insert / delete / update commands hebben.

Als je het wilt doen mbhv een DataSet en de Update method van je data-adapter, zal je dus een nieuwe datarow moeten toevoegen aan de datatable in je dataset.
Je kan dit doen dmv de NewRow() en AddRow methods.

code:
1
2
3
4
5
DataRow dr = myDs.Tables[0].NewRow();

dr["blaat"] = "melp";
....
myDs.Tables[0].Rows.Add (dr);

code uit de losse pols, dus die methodnamen kunnen wel iets anders zijn ofzo

Als je het niet wilt doen via een dataset, dan roep je gewoon de ExecuteNonQuery method aan van je OleDbCommand.

[ Voor 41% gewijzigd door whoami op 24-06-2004 16:47 ]

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Ok, ik heb dan toch maar de eerste methode geprobeerd met de Update methode.

Dit heb ik nu dan:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim strConnection As String = ConfigurationSettings.AppSettings("ConnString")
Dim cnn As New OdbcConnection(strConnection)
Dim strSQL As String = "SELECT * FROM iTransaction "
Dim da As New OdbcDataAdapter(strSQL, cnn)
Dim CmdBld As New OdbcCommandBuilder(da) 
Dim dsServer As New DataSet 

da.Fill(dsServer, "ServerData")

Dim row As DataRow = dsServer.Tables("ServerData").NewRow
row(0) = "blaat"
row(1) = "test"

dsServer.Tables("ServerData").Rows.Add(row)
da.Update(dsServer, "ServerData")


Ik heb de code zo simpel mogelijk teruggebracht, en dit werkt ook. Alleen nu krijg ik problemen als ik een lege string wil invoegen. Ik heb een veld in mijn MySQL database die ik eventueel leeg wil laten. Als ik een rij invoeg met een lege string dan krijg ik dus dit: NO_DATA - no error information available
Die melding wordt gegeneerd bij de da.Fill methode.

Ik heb ook al geprobeerd om een spatie in voeren, maar geen verschil. Is dit dan toch een bug? |:(

[ Voor 76% gewijzigd door CaptBiele op 25-06-2004 08:15 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Als het gegenereerd wordt bij de fill, dan heeft het toch niks met het toevoegen te maken?

Als je een row wilt toevoegen met een auto-incr. PK veld, dan zal je best die column in je datatable ook als een PK, auto-incr. definieren. Als je geen conflicten wil, kan je die auto-incr. in je datatable laten aflopen ipv oplopen.

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
whoami schreef op 25 juni 2004 @ 08:28:
Als het gegenereerd wordt bij de fill, dan heeft het toch niks met het toevoegen te maken?

Als je een row wilt toevoegen met een auto-incr. PK veld, dan zal je best die column in je datatable ook als een PK, auto-incr. definieren. Als je geen conflicten wil, kan je die auto-incr. in je datatable laten aflopen ipv oplopen.
Het toevoegen lukt een keer, maar als ik dan de Fill aanroep, komt die waarschijnlijk dat lege veld tegen, en krijg ik deze foutmelding.

Hoe zou ik conflicten moeten krijgen met het PK veld? Ik definieer nu de PK helemaal niet, en de MySQL database vult deze automatisch goed in. (zover ik heb meegemaakt dan)

Dit is mijn structuur van de tabel waarmee ik nu test:
MySQL:
1
2
3
CREATE TABLE iTransaction (AutoNr int2 auto_increment not null, primary key (AutoNr), 
s_CmpId char(6) not null,
s_UsrId char(4) not null)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
CaptBiele schreef op 25 juni 2004 @ 08:39:
[...]


Het toevoegen lukt een keer, maar als ik dan de Fill aanroep, komt die waarschijnlijk dat lege veld tegen, en krijg ik deze foutmelding.
Ik denk niet dat het met lege velden te maken heeft.

Kan je de exceptie eens catchen, en kijken of die exception ook innerexceptions heeft, en die foutboodschappen eens bekijken?

code:
1
2
3
4
5
6
7
8
9
10
11
catch( Exception ex )
{
    StringBuilder sb = new StringBuilder();

    while( ex != null )
    {
          sb.Append(ex.Message);
          ex = ex.InnerException;
    }
    System.Diagnostics.Debug.WriteLine(sb.ToString());
}
Hoe zou ik conflicten moeten krijgen met het PK veld? Ik definieer nu de PK helemaal niet, en de MySQL database vult deze automatisch goed in. (zover ik heb meegemaakt dan)
Ik heb het ff met een Access db geprobeerd, en dat loopt idd goed.
(Enkel toevoegingen dan).

[ Voor 17% gewijzigd door whoami op 25-06-2004 08:59 ]

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Dit is de volledige foutmelding....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
NO_DATA - no error information available 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.Odbc.OdbcException: NO_DATA - no error information available

Source Error: 


Line 41:         Dim dsServer As New DataSet 'contains the original data
Line 42: 
Line 43:         da.Fill(dsServer, "ServerData")
Line 44: 
Line 45:         Dim row As DataRow = dsServer.Tables("ServerData").NewRow
 

Source File: C:\Inetpub\wwwroot\TestXML\WebForm1.aspx.vb    Line: 43 

Stack Trace: 


[OdbcException: NO_DATA - no error information available]
   System.Data.Odbc.OdbcConnection.HandleError(HandleRef hrHandle, SQL_HANDLE hType, RETCODE retcode) +32
   System.Data.Odbc.OdbcDataReader.GetData(Int32 i, SQL_C sqlctype, Int32 cb) +259
   System.Data.Odbc.OdbcDataReader.internalGetString(Int32 i) +102
   System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap) +69
   System.Data.Odbc.OdbcDataReader.GetValue(Int32 i) +53
   System.Data.Odbc.OdbcDataReader.GetValues(Object[] values) +51
   System.Data.Common.SchemaMapping.LoadDataRow(Boolean clearDataValues, Boolean acceptChanges) +61
   System.Data.Common.DbDataAdapter.FillLoadDataRow(SchemaMapping mapping) +155
   System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) +260
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) +129
   System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +304
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +77
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +36
   TestXML.WebForm1.Page_Load(Object sender, EventArgs e) in C:\Inetpub\wwwroot\TestXML\WebForm1.aspx.vb:43
   System.Web.UI.Control.OnLoad(EventArgs e) +67
   System.Web.UI.Control.LoadRecursive() +35
   System.Web.UI.Page.ProcessRequestMain() +731


Heb geprobeerd om innerexceptions uit te printen met
Visual Basic .NET:
1
Response.Write(ex.InnerExceptions.ToString())

maar die bestaat niet....

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Klik

Eerste link, je moet een patch installeren.
(Het heeft dus toch met lege strings te maken)

[ Voor 18% gewijzigd door whoami op 25-06-2004 09:27 ]

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
Woei.. het lijkt nu te werken... _/-\o_

Ok samenvatting: als je dit probleem hebt:
When you use an ANSI ODBC driver, the ODBC Driver Manager may incorrectly return SQL_NO_DATA_FOUND for a column that is defined as VARCHAR or CHAR and that has an empty string in it. The problem does not occur if the column contains some data or a "NULL" value. The problem only occurs if the data is an empty string and you bind it from the client side with SQL_C_WCHAR.
Dan moet je deze patch installeren. Meer info te vinden in de M$ KB

[ Voor 91% gewijzigd door CaptBiele op 25-06-2004 09:52 ]

Pagina: 1