webForumDet fria alternativet

Problem med OleDbParameter och insert

.NET

13 svar · 912 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#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?

Medlem sedan feb. 2005280 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

Medlem sedan mars 20011 880 inlägg
#3

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

Medlem sedan feb. 2005280 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

Medlem sedan mars 20011 880 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.

Medlem sedan mars 20011 880 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(

Medlem sedan jan. 20012 204 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.

Medlem sedan jan. 2008280 inlägg
#8

Kodrad ska du ändra:

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

Medlem sedan mars 20011 880 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...

Medlem sedan mars 20011 880 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???

Medlem sedan jan. 20012 204 inlägg
#11

På rad 7 har du en DBTime fortfarande.

Medlem sedan mars 20011 880 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

Medlem sedan juni 200032 967 inlägg
#13

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

Medlem sedan mars 20011 880 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.

269 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)