webForumDet fria alternativet

Problem med OleDbParameter och insert

13 svar · 910 visningar · startad av saw

sawMedlem sedan mars 20011 883 inlägg
#1

Jag försöker nu så långt som möjligt att använda mig av OleDbParameter men
vid min insert så stöter jag på patrul.
Först error text(som jag enbart fick fram via try/catch.

Anslutningen stängdes inte. Anslutningens aktuella status är öppen.

Koden (tyvärr lite lång) ser ut så här:

try
        {
            DBConn.Close();
            sql = "INSERT INTO t_Order (KundNr, AnstNr, tjanst, startDatum, 
startTid, slutDatum, slutTid, antalTimmar, Klart, Beskrivning) VALUES 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

            OleDbCommand cmd = new OleDbCommand("", DBConn);
            cmd.CommandText = sql;

            OleDbParameter paramKundNr = new OleDbParameter("@KundNr", DbType.String);
            paramKundNr.Value = LKundNr.Text;
            cmd.Parameters.Add(paramKundNr);

            OleDbParameter paramAnstNr = new OleDbParameter("@AnstNr", DbType.String);
            paramAnstNr.Value = LAnstNr.Text;
            cmd.Parameters.Add(paramAnstNr);

            OleDbParameter paramtjanst = new OleDbParameter("@tjanst", DbType.String);
            paramtjanst.Value = ListBox1.SelectedValue.ToString();
            cmd.Parameters.Add(paramtjanst);

            OleDbParameter paramstartDatum = new OleDbParameter("@startDatum", DbType.DateTime);
            paramstartDatum.Value = CalendarPopup1.SelectedDate.ToShortDateString();
            cmd.Parameters.Add(paramstartDatum);

            OleDbParameter paramstartTid = new OleDbParameter("@startTid", DbType.DateTime);
            paramstartTid.Value = TimePicker1.SelectedTime.ToShortTimeString();
            cmd.Parameters.Add(paramstartTid);
            DBConn.Open();

            OleDbParameter paramslutDatum = new OleDbParameter("@slutDatum", DbType.DateTime);
            paramslutDatum.Value = CalendarPopup2.SelectedDate.ToShortDateString();
            cmd.Parameters.Add(paramslutDatum);

            OleDbParameter paramslutTid = new OleDbParameter("@slutTid", DbType.DateTime);
            paramslutTid.Value = TimePicker2.SelectedTime.ToShortTimeString();
            cmd.Parameters.Add(paramslutTid);

            OleDbParameter paramantalTimmar = new OleDbParameter("@antalTimmar", DbType.DateTime);
            paramantalTimmar.Value = 0;
            cmd.Parameters.Add(paramantalTimmar);

            OleDbParameter paramKlart = new OleDbParameter("@Klart", DbType.Boolean);
            paramKlart.Value = false;
            cmd.Parameters.Add(paramKlart);

            OleDbParameter paramBeskrivning = new OleDbParameter("@Beskrivning", DbType.String);
            paramBeskrivning.Value = false;
            cmd.Parameters.Add(paramBeskrivning);

            DBConn.Open();
            cmd.ExecuteNonQuery();
            DBConn.Close();
        }
        catch (Exception fel)
        {
            TextBox2.Text = fel.Message;
        }
        DBConn.Close();

Som ni förstår så sparas ingen data i databasen.Vad gör jag för fel?

freguzMedlem sedan feb. 2005282 inlägg
#2

Först tycker jag man bör ha med stack trace så man ser vilken rad

TextBox2.Text = fel.Message + fel.StackTrace;

Sen är det enklare och tydligare om man anger @Beskrivning istället för ? i sql-satsen

sawMedlem sedan mars 20011 883 inlägg
#3

Enligt vad jag har läst så skall man använda sig av ?, är det fel menar du?

freguzMedlem sedan feb. 2005282 inlägg
#4

Det går säkert bra med ?, bara det att jag vill se vilka param jag placerar vart i sql satsen, och med ? måste väl param komma i rätt ordningsföljd?

Eftersom ditt fel kanske inte alls har med det att göra så kanske jag ska sluta yra om det nu :bire

sawMedlem sedan mars 20011 883 inlägg
#5

Nu har jag fått lite mera kött på benen.
I början av denna class så ser jag till att min DBConn.close()

Anslutningen stängdes inte. Anslutningens aktuella status är öppen.    vid 
System.Data.ProviderBase.DbConnectionInternal.OpenConnection
(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   vid System.Data.OleDb.OleDbConnection.Open()
   vid Admin_Order_Order.saveData() i c:\Inetpub\wwwroot\Mkef\Admin\Order\Order.aspx.cs:rad 308

Om jag tar bort DBConn.close()

Anslutningen stängdes inte. Anslutningens aktuella status är öppen.    vid 
System.Data.ProviderBase.DbConnectionInternal.OpenConnection
(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   vid System.Data.OleDb.OleDbConnection.Open()
   vid Admin_Order_Order.saveData() i 
c:\Inetpub\wwwroot\Mkef\Admin\Order\Order.aspx.cs:rad 308

Vad jag kan se gör det ingen skillnad.
Jag har dessutom varit noga med att använda mig av DBConn.Close() i alla
classer där jag använder DBConn.

sawMedlem sedan mars 20011 883 inlägg
#6

Jag har gjort ett nytt försök på ett annat sätt:

            sql = "INSERT INTO t_Order (KundNr, AnstNr, tjanst, startDatum, 
startTid, slutDatum, slutTid, antalTimmar, Klart, Beskrivning) VALUES 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            //***********************

            OleDbCommand insertCommand = new OleDbCommand(sql, DBConn);
            insertCommand.Parameters.Add(new OleDbParameter("@KundNr", OleDbType.VarChar));
            insertCommand.Parameters["@KundNr"].Value = LKundNr.Text;

            insertCommand.Parameters.Add(new OleDbParameter("@AnstNr", OleDbType.VarChar));
            insertCommand.Parameters["@AnstNr"].Value = LAnstNr.Text;

            insertCommand.Parameters.Add(new OleDbParameter("@tjanst", OleDbType.VarChar));
            insertCommand.Parameters["@tjanst"].Value = ListBox1.SelectedValue.ToString();

            insertCommand.Parameters.Add(new OleDbParameter("@startDatum", OleDbType.DBDate));
            insertCommand.Parameters["@startDatum"].Value = CalendarPopup1.SelectedDate;

            insertCommand.Parameters.Add(new OleDbParameter("@startTid", OleDbType.DBTime));
            insertCommand.Parameters["@startTid"].Value = TimePicker1.SelectedTime;

            insertCommand.Parameters.Add(new OleDbParameter("@slutDatum", OleDbType.DBDate));
            insertCommand.Parameters["@slutDatum"].Value = CalendarPopup2.SelectedDate;

            insertCommand.Parameters.Add(new OleDbParameter("@slutTid", OleDbType.DBTime));
            insertCommand.Parameters["@slutTid"].Value = TimePicker2.SelectedTime;

            insertCommand.Parameters.Add(new OleDbParameter("@antalTimmar", OleDbType.DBTime));
            insertCommand.Parameters["@antalTimmar"].Value = 0;

            insertCommand.Parameters.Add(new OleDbParameter("@Klart", OleDbType.Boolean));
            insertCommand.Parameters["@Klart"].Value = false;

            insertCommand.Parameters.Add(new OleDbParameter("@Beskrivning", OleDbType.VarChar));
            insertCommand.Parameters["@Beskrivning"].Value = TextBox2.Text;

            DBConn.Open();
            insertCommand.ExecuteNonQuery();
            DBConn.Close();

..men får foljande error:

Det gick inte att konvertera parametervärdet från en DateTime till en 
TimeSpan.    vid System.Data.OleDb.OleDbParameter.CoerceValue(Object 
value, NativeDBType destinationType)
   vid System.Data.OleDb.OleDbParameter.BindParameter(Int32 index, 
Bindings bindings)
   vid System.Data.OleDb.OleDbCommand.CreateAccessor()
   vid System.Data.OleDb.OleDbCommand.InitializeCommand(CommandBehavior behavior, Boolean throwifnotsupported)
   vid System.Data.OleDb.OleDbCommand.ExecuteCommand
(CommandBehavior behavior, Object& executeResult)
   vid System.Data.OleDb.OleDbCommand.ExecuteReaderInternal
(CommandBehavior behavior, String method)
   vid System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   vid Admin_Order_Order.saveData() i 
c:\Inetpub\wwwroot\Mkef\Admin\Order\Order.aspx.cs:rad 300

Skall det vara så omöjligt att få till detta.
Trots era protester så verkar det snart som om jag får gå tillbaka
till mitt gammla sätt och skriva SQL på... x(

PMedlem sedan jan. 20012 107 inlägg
#7

"Det gick inte att konvertera parametervärdet från en DateTime till en
TimeSpan." Där har du felet. Kontrollera dina värden.

invecklarenMedlem sedan jan. 2008270 inlägg
#8

Kodrad ska du ändra:

insertCommand.Parameters.Add(new OleDbParameter("@startTid", OleDbType.DBTime));
insertCommand.Parameters["@startTid"].Value = TimePicker1.SelectedTime;

sawMedlem sedan mars 20011 883 inlägg
#9

Jo att det är där jag skall ändra det förstår jag, men till vad???
Jag borde väll rimligen kunna använda mig av TimePicker1.SelectedTime...

sawMedlem sedan mars 20011 883 inlägg
#10

Nu försökte jag så här:

insertCommand.Parameters.Add(new OleDbParameter("@slutDatum", 
OleDbType.DBDate));
            insertCommand.Parameters["@slutDatum"].Value = 
Convert.ToDateTime(CalendarPopup2.SelectedDate.ToShortDateString());

            insertCommand.Parameters.Add(new OleDbParameter("@slutTid", 
OleDbType.DBTime));
            insertCommand.Parameters["@slutTid"].Value = Convert.ToDateTime
(TimePicker2.SelectedTime.ToShortTimeString());

och får fotfarande..

Det gick inte att konvertera parametervärdet från en DateTime till en 
TimeSpan.    vid System.Data.OleDb.OleDbParameter.CoerceValue(Object 
value, NativeDBType destinationType)
   vid System.Data.OleDb.OleDbParameter.BindParameter(Int32 index, 
Bindings bindings)
   vid System.Data.OleDb.OleDbCommand.CreateAccessor()
   vid System.Data.OleDb.OleDbCommand.InitializeCommand
(CommandBehavior behavior, Boolean throwifnotsupported)
   vid System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   vid System.Data.OleDb.OleDbCommand.ExecuteReaderInternal
(CommandBehavior behavior, String method)
   vid System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   vid Admin_Order_Order.saveData() i c:\Inetpub\wwwroot\Mkef\Admin\Order\Order.aspx.cs:rad 300

..dags för mig att lägga av???

PMedlem sedan jan. 20012 107 inlägg
#11

På rad 7 har du en DBTime fortfarande.

sawMedlem sedan mars 20011 883 inlägg
#12

Nu börjar det att hända saker.

string td = TimePicker1.SelectedTime.ToShortTimeString();
            insertCommand.Parameters.Add(new OleDbParameter("@startTid", 
OleDbType.DBTime));
            insertCommand.Parameters["@startTid"].Value = @TimeSpan.Parse(td);

Men nu kommer nya problem.
Om jag vet stardatum(naturligtvis) men inte slutdatum, så ville jag att det
skulle skrivas ut som "0000:00:00", men jag misslyckas klart...

DateTime dDate;
            if (CalendarPopup2.SelectedDate > CalendarPopup1.SelectedDate)
                dDate = CalendarPopup2.SelectedDate;
            else
                dDate = Convert.ToDateTime("0000:00:00");<-----detta tycker han inte om

            insertCommand.Parameters.Add(new OleDbParameter("@slutDatum", 
OleDbType.DBDate));
            insertCommand.Parameters["@slutDatum"].Value = @TimeSpan.Parse
(dDate.ToShortDateString());

Error

Strängen identifierades inte som en giltig DateTime-sträng.    vid 
System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, 
DateTimeStyles styles)
   vid System.DateTime.Parse(String s, IFormatProvider provider)
   vid System.Convert.ToDateTime(String value)
   vid Admin_Order_Order.saveData() i c:\Inetpub\wwwroot\Mkef\Admin\Order\Order.aspx.cs:rad 289

Är jag helt ute och seglar

@ndersMedlem sedan juni 200026 914 inlägg
#13

0000:00:00 är inget giltigt datum / ingen giltig tid.
Varför inte lagra NULL?

sawMedlem sedan mars 20011 883 inlägg
#14

Hej @nders.
Det har jag försökt med men får då värdet i databasen "2001-01-01", och det är ju
inget vidare snyggt.
Det är vid if-satsen som du kan se här ovan som jäklas med mig.

Genererad på 393 ms · cache AV · v20260730165559-full.f96bc7eb