【问题标题】:C# data.fill (conversion failure)C# data.fill(转换失败)
【发布时间】:2012-03-30 17:47:30
【问题描述】:

使用 C#、.NET 4、SQL、visual studio 2010 和 sql server manager 2008。

嗨,伙计们,似乎是老问题,很容易解决 101 问题,但有些事情一直困扰着我。

我的程序运行查询并获取数据并填充数据集。

我的一个字段称为 pg(产品组)并设置为 nvarchar(255)。 大多数 pg 是 30、50、12 等数字,但也有例外,例如 T1B 和 50a。

由于某种原因,我遇到了转换错误。

“将 varchar 值 'T1B' 转换为 int 时转换失败”。

在我的代码中,我使用的是 data.fill();

是我还是似乎 data.fill 试图将字段 PG 分配为整数,因为它提取的第一条记录看起来像一个 int? 老实说,我一直认为填充会模仿任何 sql 数据类型与其等价物。

希望它很容易被我忽略。

如果您想查看更多代码,请告诉我,我会编辑这篇文章。

非常感谢

SQL 查询

USE [ShaftData]
GO
/****** Object:  StoredProcedure [dbo].[GetSalesParetotemp]    Script Date: 03/14/2012       09:30:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetSalesParetotemp] 
@acct varchar(255), 
@From date, 
@Too date
AS
SELECT i.Acct,
   i.Name, 
   i.Document, 
   i.Part, 
   i.Qty, 
   i.Unit, 
   dbo.NEWPareto.Pareto, 
   i.pg,
   dbo.MyPgTable.PgName,
   i.[DateTime]

FROM   
OPENQUERY(SACBAUTO, 'SELECT dbo.iHeads.acct,
                            dbo.iHeads.name,
                            dbo.iLines.Document,
                            dbo.iLines.Part,
                            dbo.iLines.Pg,
                            dbo.iLines.Qty,
                            dbo.iLines.unit,
                            dbo.iHeads.[DateTime]  
                     FROM Autopart.dbo.iheads INNER JOIN     Autopart.dbo.iLines ON 
                     Autopart.dbo.Iheads.document =   autopart.dbo.iLines.document
                     GROUP By dbo.iHeads.acct,
                            dbo.iHeads.name,
                            dbo.iLines.Document,
                            dbo.iLines.Part,
                            dbo.iLines.Pg,
                            dbo.iLines.Qty,
                            dbo.iLines.unit,
                            dbo.iHeads.[DateTime]
                      ') i
left JOIN
  dbo.NEWPareto
ON 
i.Part collate SQL_Latin1_General_CP1_CI_AS = dbo.NEWPareto.Part 
left JOIN
dbo.MyPgTable 
ON  
  i.pg collate SQL_Latin1_General_CP1_CI_AS = dbo.MyPgTable.[pGroup]

WHERE
 (i.[DateTime] BETWEEN @From AND @Too) AND
 i.Acct = @acct 
 AND i.pg != 60
 AND i.pg != 61
 AND i.pg != 62

 GROUP BY i.Acct,
   i.Name, 
   i.Document, 
   i.Part, 
   i.Qty, 
   i.Unit, 
   dbo.NEWPareto.Pareto, 
   i.pg,
   dbo.MyPgTable.PgName, 
   i.[DateTime]

这是调用它的方法

try
        {
            string myConn = "Server=derp;" +
                            "Database=derp;" +
                            "uid=derp;" +
                            "pwd=derp;" +
                            "Connect Timeout=120;";

            string acct;// test using 1560

            SqlConnection conn = new SqlConnection(myConn);
            SqlCommand Pareto = new SqlCommand();
            BindingSource bindme = new BindingSource();
            SqlDataAdapter adapt1 = new SqlDataAdapter(Pareto);
            DataSet dataSet1 = new DataSet();
            DataTable table1 = new DataTable();

            acct = Acct;

            string fromDate = this.dateTimePicker1.Value.ToString("MM/dd/yyyy");
            string tooDate = this.dateTimePicker2.Value.ToString("MM/dd/yyyy");

            Pareto.Connection = conn;
            Pareto.CommandType = CommandType.StoredProcedure;
            Pareto.CommandText = "dbo.GetSalesParetotemp";
            Pareto.CommandTimeout = 120;

            Pareto.Parameters.AddWithValue("@acct", acct);
            Pareto.Parameters.AddWithValue("@from", fromDate);
            Pareto.Parameters.AddWithValue("@too", tooDate);

            SetCheckBoxValue(true);
            SetPictureBoxVisibility(true);
            //label1.Visible = true;
            adapt1.Fill(dataSet1, "Pareto");
            //label1.Visible = false;
            SetCheckBoxValue(false);
            SetPictureBoxVisibility(false);

            SetDataGrid(true, dataSet1, "Pareto", DataGridViewAutoSizeColumnsMode.AllCells);

            dataGridView1.AutoResizeColumns(
                DataGridViewAutoSizeColumnsMode.AllCells);
        }
        catch (Exception execc)
        {
            MessageBox.Show("Whoops! Seems we couldnt connect to the server!"
                            + " information:\n\n" + execc.Message + execc.StackTrace,
                            "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }

【问题讨论】:

  • 你能粘贴一些相关的代码吗? :)
  • 没问题,这是查询,这是使用它的方法

标签: c# sql type-conversion


【解决方案1】:

我相信这是查询本身引起的 SQL 错误,因为它提到了“varchar”,如果是 .Net 问题,它会说“字符串”。

具体来说:

WHERE 
 (i.[DateTime] BETWEEN @From AND @Too) AND 
 i.Acct = @acct  
 AND i.pg != 60 
 AND i.pg != 61 
 AND i.pg != 62 

当遇到具有非数字 pg 值的行之一时,该子句会中断

您可以将它们更改为字符串 - 即 '60'、'61' 和 '62'

【讨论】:

  • 天哪,我知道这是我忽略的一些简单的事情,对 sql 来说非常新,感谢您的建议!我去试试,然后用结果更新你
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2012-08-24
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多