C#错误sql字符串或二进制数据

时间:2016-02-18 10:27:29

标签: c# sql-server

我正在尝试从一个表中传输数据,但是我使用C#代码转换了几种类型。我输入了出现的错误图像。

private void button5_Click(object sender, EventArgs e)
{
    try
    {
        //SORGENTE 

        string dbserver = textBox5.Text;
        string dbname = textBox8.Text;
        string dbusername = textBox7.Text;
        string dbpassword = textBox6.Text;

        SqlConnection conn = new SqlConnection("Data Source=" + dbserver + ";Initial Catalog=" + dbname + ";User ID=" + dbusername + ";Password=" + dbpassword + "");

        conn.Open();
        //PER QUERY PESANTI:
        string queryset2 = "SET IDENTITY_INSERT Preventivi ON ";

        SqlCommand myCommandset2 = new SqlCommand(queryset2, conn);

        myCommandset2.ExecuteNonQuery();

        //FINE QUERY PESANTI

        SqlCommand cmd = new SqlCommand("SELECT IDPreventivo,IDCliente,Data,RiferimentoInterno,Note,Totale,CostoImpianto,SpeseGen,PercSpeseGen,Utile,PercUtile,Margine,PercMargine,Testata,Chiusura,CodiceFirma FROM Preventivi WHERE DittaPreventivo = '100Impianti'", conn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        String idpreventivo = null;
        String idcliente = null;
        String datacreazione = null;
        String riferimentointerno = null;
        String note = null;
        String totaleimpianto = null;
        String costoimpianto = null;
        String spesegenerali = null;
        String percentualespesegenerali = null;
        String utile = null;
        String percentualeutile = null;
        String margine = null;
        String percentualemargine = null;
        String testata = null;
        String chiusura = null;
        String codicefirma = null;

        //CONVERSIONI
        foreach (DataRow dr in dt.Rows)
        {
            idpreventivo = dr["IDPreventivo"].ToString();
            idcliente = dr["IDCliente"].ToString();
            datacreazione = dr["Data"].ToString();
            riferimentointerno = dr["RiferimentoInterno"].ToString();
            note = dr["Note"].ToString();
            totaleimpianto = dr["Totale"].ToString();
            costoimpianto = dr["CostoImpianto"].ToString();     
            spesegenerali = dr["SpeseGen"].ToString();
            percentualespesegenerali = dr["PercSpeseGen"].ToString(); 
            utile= dr["Utile"].ToString();
            percentualeutile = dr["PercUtile"].ToString();
            margine = dr["Margine"].ToString();
            percentualemargine = dr["PercMargine"].ToString();             
            testata = dr["Testata"].ToString();
            chiusura = dr["Chiusura"].ToString();
            codicefirma = dr["CodiceFirma"].ToString();

            //Destinazione 

            string dbserver2 = textBox4.Text;
            string dbname2 = textBox1.Text;
            string dbusername2 = textBox2.Text;
            string dbpassword2 = textBox3.Text;

            SqlConnection conn2 = new SqlConnection("Data Source=" + dbserver2 + ";Initial Catalog=" + dbname2 + ";User ID=" + dbusername2 + ";Password=" + dbpassword2 + "");

            conn2.Open();

            //PER QUERY PESANTI:
            string queryset3 = "SET IDENTITY_INSERT Preventivo ON ";

            SqlCommand myCommandset3 = new SqlCommand(queryset3, conn2);

            myCommandset3.ExecuteNonQuery();

            //FINE QUERY PESANTI

            string query2 = "INSERT INTO Preventivo (IdPreventivo,IdCliente,DataInserimento,RiferimentoInterno,Note,Totale,CostoImpianto,SpeseGenerali,PercentualeSpeseGenerali,Utile,PercentualeUtile,Margine,PercentualeMargine,Testata,Chiusura,CodiceFirma) VALUES(@IdPreventivo,@IdCliente,@DataInserimento,@RiferimentoInterno,@Note,@Totale,@CostoImpianto,@SpeseGenerali,@PercentualeSpeseGenerali,@Utile,@PercentualeUtile,@Margine,@PercentualeMargine,@Testata,@Chiusura,@CodiceFirma)";

            SqlCommand myCommand = new SqlCommand(query2, conn2);

            int idp = System.Convert.ToInt32(idpreventivo);

            myCommand.Parameters.AddWithValue("@IdPreventivo", idp);

            int idc = System.Convert.ToInt32(idcliente);

            myCommand.Parameters.AddWithValue("@IdCliente", idc);

            myCommand.Parameters.AddWithValue("@DataInserimento", datacreazione);

            decimal totimp = System.Convert.ToDecimal(totaleimpianto);

            myCommand.Parameters.AddWithValue("@Totale", totimp);

            decimal costimp = System.Convert.ToDecimal(costoimpianto);

            myCommand.Parameters.AddWithValue("@CostoImpianto", costimp);

            decimal speseimp = System.Convert.ToDecimal(spesegenerali);

            myCommand.Parameters.AddWithValue("@SpeseGenerali", speseimp);

            decimal perspeseimp = System.Convert.ToDecimal(percentualespesegenerali);

            myCommand.Parameters.AddWithValue("@PercentualeSpeseGenerali", perspeseimp);

            decimal ut = System.Convert.ToDecimal(utile);

            myCommand.Parameters.AddWithValue("@Utile", ut);

            decimal perut = System.Convert.ToDecimal(percentualeutile);

            myCommand.Parameters.AddWithValue("@PercentualeUtile", perut);

            decimal mar = System.Convert.ToDecimal(margine);

            myCommand.Parameters.AddWithValue("@Margine", mar);

            decimal permar = System.Convert.ToDecimal(percentualemargine);

            myCommand.Parameters.AddWithValue("@PercentualeMargine", permar);

            myCommand.Parameters.AddWithValue("@Testata", testata);

            myCommand.Parameters.AddWithValue("@Chiusura", chiusura);

            int codf = Int32.Parse(codicefirma.ToString());

            myCommand.Parameters.AddWithValue("@CodiceFirma", codf);

            myCommand.Parameters.AddWithValue("@RiferimentoInterno", riferimentointerno);

            myCommand.Parameters.AddWithValue("@Note", note);

            myCommand.ExecuteNonQuery();

            conn2.Close();

            //fine destinazione
        }

        // textBox9.Text = val.ToString();
        //MessageBox.Show(val);
        MessageBox.Show("Dati Esportati ");

        conn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(" " + ex);
    }
}

错误是:

ERROR IMAGE

SQL Server表结构:

CREATE TABLE [dbo].[Preventivi]
(
    [IDPreventivo] [int] IDENTITY(1,1) NOT NULL,
    [Data] [datetime] NOT NULL,
    [RiferimentoInterno] [varchar](50) NOT NULL,
    [IDCliente] [int] NOT NULL,
    [IDProgettista] [int] NULL,
    [Contatto] [varchar](50) NOT NULL,
    [Stato] [varchar](50) NOT NULL,
    [TipoFornitura] [varchar](50) NOT NULL,
    [Note] [varchar](500) NOT NULL,
    [DirettoreLavori] [varchar](50) NOT NULL,
    [CostoImpianto] [decimal](18, 2) NOT NULL,
    [PercSpeseGen] [decimal](9, 2) NOT NULL,
    [SpeseGen] [decimal](18, 2) NOT NULL,
    [PercUtile] [decimal](9, 2) NOT NULL,
    [Utile] [decimal](18, 2) NOT NULL,
    [PercMargine] [decimal](9, 2) NOT NULL,
    [Margine] [decimal](18, 2) NOT NULL,
    [Totale] [decimal](18, 2) NOT NULL,
    [FlagCalcoloUtile] [char](1) NOT NULL,
    [Testata] [varchar](5000) NOT NULL,
    [Chiusura] [varchar](5000) NOT NULL,
    [CodiceFirma] [int] NOT NULL,
    [Firma] [image] NULL,
    [DittaPreventivo] [varchar](50) NULL,
    [Testata1] [varchar](5000) NOT NULL,
    [Chiusura1] [varchar](5000) NOT NULL,
    [IDtemp] [varchar](100) NULL,
)

CREATE TABLE [dbo].[Preventivo]
(
    [IdPreventivo] [int] IDENTITY(1,1) NOT NULL,
    [IdCliente] [int] NULL,
    [RiferimentoInterno] [varchar](60) NULL,
    [Note] [varchar](200) NULL,
    [DataInserimento] [datetime] NULL,
    [Stato] [varchar](20) NULL,
    [DataAccettazione] [datetime] NULL,
    [Totale] [decimal](18, 5) NULL,
    [CostoImpianto] [decimal](18, 5) NULL,
    [SpeseGenerali] [decimal](18, 5) NULL,
    [PercentualeSpeseGenerali] [decimal](18, 5) NULL,
    [Utile] [decimal](18, 5) NULL,
    [PercentualeUtile] [decimal](18, 5) NULL,
    [Margine] [decimal](18, 5) NULL,
    [PercentualeMargine] [decimal](18, 5) NULL,
    [Testata] [varchar](255) NULL,
    [Chiusura] [varchar](255) NULL,
    [CodiceFirma] [int] NULL,
)

2 个答案:

答案 0 :(得分:2)

除此之外,在第一个表中,您有

[Testata1] [varchar](5000) NOT NULL,
[Chiusura1] [varchar](5000) NOT NULL,

在第二个表格中,您有

[Testata] [varchar](255) NULL,
[Chiusura] [varchar](255) NULL,

如果有一行Testata1值超过255个字符,它就不适合Testata并且会给你"字符串或二进制数据将被截断"错误。

你必须确保你要插入到新表中的内容适合那里。

答案 1 :(得分:0)

我相信以下声明是使用字符串变量添加日期参数。并且它看起来参数的值不符合SQL所期望的日期格式。请将变量“datacreazione”转换为c#中的datetime对象,并将其作为参数传递给SQL。

myCommand.Parameters.AddWithValue("@DataInserimento", datacreazione);

也许您可以尝试以下

DateTime creationDate;
string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy",
                    "dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"};

DateTime.TryParseExact(datacreazione, formats, 
        System.Globalization.CultureInfo.InvariantCulture,
        DateTimeStyles.None, out creationDate)
myCommand.Parameters.AddWithValue("@DataInserimento", creationDate);

OR

您也可以像这样更改sql语句的读取部分

DateTime datacreazione;

for 
{
   ...
   datacreazione = dr["Data"]
}