Avatar billede kischi Novice
23. december 2008 - 13:59 Der er 8 kommentarer og
1 løsning

allow null problem i sql server 2005

Hej jeg har et problem med at kopiere data fra et excel dokument til ms sql 2005.

Jeg har en fil som hedder database.xls, hver gang jeg prøver at kopiere data fra det til sql kommer den med en fejl:
"Column 'tid' does not allow DBNull.Value."

I kan se fejlmeddelselsen på:
http://www.radio.web.surftown.dk/admin/indset_program.aspx og så klik på den øverste knap "button"

Men når jeg checker "allow null" af i db så insætter den data i sql serveren.
Men tiden bliver skrevet sådan her:
30-12-1899 12:00:00 istedet for bare 12:00 som jeg har skrevet det i excel.

Så er der nogle som ved hvordan jeg løser problemet hvis "allow null" ikke er checked?

Min excel fil ser sådan ud:

id, tid, txt, dato
-----------------------------------
1, 12:00,dnwq, 23-12-2008
2, 14:00, aca, 23-12-2008

min sql server database ser sådan ud med datatypes:

ID(bigint),
tid(varchar(50),
txt(text),
dato(datetime)

Min kode som kopiere dataen til sql ser sådan ud:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Common;
using System.Data.OleDb;




public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }


    protected void Button1_Click(object sender, EventArgs e)
    {
        string excelConnectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;""", Server.MapPath("database.xls"));



        using (OleDbConnection connection =
            new OleDbConnection(excelConnectionString))
        {

            OleDbCommand command = new OleDbCommand
            ("Select * FROM [Sheet1$]", connection);

            connection.Open();

            using (DbDataReader dr = command.ExecuteReader())
            {
                string sqlConnectionString = "Data Source=212.97.133.33;Initial Catalog=kischi2_database;UID=kischi2_radio;PWD=kischi;";

                using (SqlBulkCopy bulkCopy =
                  new SqlBulkCopy(sqlConnectionString))
                {
                    bulkCopy.DestinationTableName = "PROGRAM";
                    bulkCopy.WriteToServer(dr);

                    connection.Close();

                   
                }
            }
        }
    }
}


Jeg håber i forstår hvad jeg mener og at i kan hjælpe?

Det skal også lige siges at den indsætter dataen rigtigt, hvis man udfylder textboxene på siden. Det er kun når man kopiere fra excel.

Mvh. kischi
Avatar billede Syska Mester
23. december 2008 - 14:32 #1
DateTime i sql vil altid være dd-mm-yyyy hh:mm:ss og fylde 8 byte.

Du må selv stå for formateringen når du henter data ud igen hvis du ikke vil have resten med ...

DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()

MSSQL 2008 har en Time type og Date type som kan bruges her, men kræver jo selvf at du kan får Surftown til at bruge SQL 2008 :-)
Avatar billede kischi Novice
23. december 2008 - 14:49 #2
Ok hvordan ville jeg så kunne integrere i min kode at den kun skal trække tiden ud.

Min kode som får dataen ud ser sådan ud:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class udsendelser : System.Web.UI.Page
{
    SqlConnection objconn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());

    protected void Page_Load(object sender, EventArgs e)
    {
        GetLinks();

        if (Request.QueryString["task"] != null)
        {

            switch (Request.QueryString["task"].ToString())
            {
                case "edit":
                    //do
                    break;
            }
           

        }
    }

 
    private void GetLinks()
    {
        SqlCommand objcmd = new SqlCommand();
        objcmd.Connection = objconn;
        objcmd.CommandType = CommandType.Text;
        objcmd.CommandText = "SELECT * FROM PROGRAM WHERE DATE >= convert(varchar, GETDATE()) AND DATE <= DATEADD(Month, 2, GETDATE())";

        SqlDataReader reader = null;

        objconn.Open();

        reader = objcmd.ExecuteReader();
        program.DataSource = reader;
        program.DataBind();

        objconn.Close();

       

    }
}

Håber du kan hjælpe?
Avatar billede Syska Mester
23. december 2008 - 17:03 #3
kommer an på hvad din "program" er for en ting ....

Men hvis du for din column eller hvad den nu binder til ... kan sætte et format kan du nok skrive følgende i den property:

format = "HH:mm"

Kan ikke huske hvad de hedder for GridView og de andre.

mvh
Avatar billede kischi Novice
24. december 2008 - 01:35 #4
Jeg bruger sql server 2005.
Nu hvis jeg skriver 19:00 i tid collonnen i excel filen.
Så kommer der til at stå 30-12-1899 19:00:00 istedet for bare 19:00.

Tid collonnen er af datatype varchar(50).

Så det er ikke engang datetime, det er derfor jeg ikke forstår hvorfår den udskriver datoen i feltet. Og det er jo altid samme dato den skriver(30-12-1899).

Jeg ved ikke hvor i koden der er noget i vejen, men her er min sql statement:

"SELECT * FROM PROGRAM WHERE DATE >= convert(varchar, GETDATE()) AND DATE <= DATEADD(Month, 2, GETDATE())";

Jeg håber du kan hjælpe mig?
Jeg tror ikke der er noget sted i property's som jeg kan ændre format til HH:mm

Mvh. Kischi
Avatar billede kischi Novice
24. december 2008 - 01:41 #5
Her kan du se hvad jeg mener: http://radio.web.surftown.dk/udsendelser.aspx

Tiden er fin nok men det er datoen og årstallet jeg skal have væk. Det er fordi den skriver det i sql databasen når den kopiere det fra excel. Men i excel står det rigtigt.

Mvh. Kischi
Avatar billede kischi Novice
26. december 2008 - 11:20 #6
Nu har jeg fået det til at virke.
Jeg skulle bare ændre formatet i collonnen til tekst. :-D
Avatar billede Syska Mester
26. december 2008 - 22:14 #7
ohhh, ja, den har nok lavet en autodetect af at det skulle være DateTime ... og så castet den til en string bagefter ... derfor årstallet fra 1899 er kommet med.

Hvis du kan bruge SQL 2008 ... så ville det være en kæmpe fordel at bruge "Time" typen ... fylder mindre end din varchar. Men det kommer selvf an på hvornår surftown har en SQL 2008 klar ... måske de allerede har det og du kan blive flyttet over på den.

// ouT
Avatar billede hrc Mester
27. december 2008 - 18:11 #8
Undskyld, men jeg har ikke læst hele tråden (det er ulvetime(r)), men hvis du indsætter data med et SQL-script kan du sætte default-værdier ind med "coalesec" eller lave en "case begin end"der fanger null-værdier.
Avatar billede kischi Novice
25. januar 2011 - 17:03 #9
Så lukker jeg lige
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester