将SQL返回select语句存储到变量中会返回错误的值

时间:2017-02-08 19:33:18

标签: c# sql-server tsql select

所以我试图将Select语句返回到变量中。它正在工作,但它返回了错误的值......

在大多数情况下,它将返回-7列的值,而不是它应该的值。我以为这是我的代码,所以我在没有参数的SQL服务器管理器中尝试过,并得到了几乎相同的结果。

我做错了什么?

这是我的选择声明(如果您不想查看代码):

"SELECT [Item #] FROM dbo.[" + cmbJobName.Text + "] WHERE [Manufacturer] LIKE @Manufacturer AND [Mill Location] LIKE @MillLocation AND [Product Description] LIKE @ProductDescription AND [Weld Seam Type] LIKE @WeldSeamType AND [Outer Dimension] LIKE @OuterDimension AND [Wall Thickness] LIKE @WallThickness AND [Coating] LIKE @Coating AND [Grade] LIKE @Grade AND [Heat] LIKE @Heat AND [ANSI/ASME] LIKE @ANSIASME AND [Purchase Order] LIKE @PurchaseOrder AND [Standard] LIKE @Standard AND [Notes] LIKE @Notes";

这是我的代码:

         try
            {
                using (SqlConnection con = new SqlConnection(Connection.MTRDataBaseConn))
                {
                    con.Open();
                    SqlCommand cmd = new SqlCommand();

                    cmd.CommandText = "SELECT [Item #] FROM dbo.[" + cmbJobName.Text + "] WHERE [Manufacturer] LIKE @Manufacturer AND [Mill Location] LIKE @MillLocation AND [Product Description] LIKE @ProductDescription AND [Weld Seam Type] LIKE @WeldSeamType AND [Outer Dimension] LIKE @OuterDimension AND [Wall Thickness] LIKE @WallThickness AND [Coating] LIKE @Coating AND [Grade] LIKE @Grade AND [Heat] LIKE @Heat AND [ANSI/ASME] LIKE @ANSIASME AND [Purchase Order] LIKE @PurchaseOrder AND [Standard] LIKE @Standard AND [Notes] LIKE @Notes";

                    cmd.Connection = con;
                    SqlParameter pManufactuter = new SqlParameter("@Manufacturer", SqlDbType.VarChar, 50);
                    SqlParameter pMillLocation = new SqlParameter("@MillLocation", SqlDbType.VarChar, 50);
                    SqlParameter pProductDescription = new SqlParameter("@ProductDescription", SqlDbType.VarChar, 50);
                    SqlParameter pWeldSeamType = new SqlParameter("@WeldSeamType", SqlDbType.VarChar, 50);
                    SqlParameter pOuterDimension = new SqlParameter("@OuterDimension", SqlDbType.VarChar, 50);
                    SqlParameter pWallThickness = new SqlParameter("@WallThickness", SqlDbType.VarChar, 50);
                    SqlParameter pCoating = new SqlParameter("@Coating", SqlDbType.VarChar, 50);
                    SqlParameter pGrade = new SqlParameter("@Grade", SqlDbType.VarChar, 50);
                    SqlParameter pHeat = new SqlParameter("@Heat", SqlDbType.VarChar, 50);
                    SqlParameter pAnsiAsme = new SqlParameter("@ANSIASME", SqlDbType.VarChar, 50);
                    SqlParameter pPurchaseOrder = new SqlParameter("@PurchaseOrder", SqlDbType.VarChar, 50);
                    SqlParameter pStandard = new SqlParameter("@Standard", SqlDbType.VarChar, 50);
                    SqlParameter pNotes = new SqlParameter("@Notes", SqlDbType.VarChar, 50);

                    pManufactuter.Value = cmbManufacturer.Text;
                    pMillLocation.Value = cmbMillLocation.Text;
                    pProductDescription.Value = cmbProductDescription.Text;
                    pWeldSeamType.Value = cmbWeldSeamType.Text;
                    pOuterDimension.Value = cmbOuterDimension.Text;
                    pWallThickness.Value = cmbWallThickness.Text;
                    pCoating.Value = cmbCoating.Text;
                    pGrade.Value = cmbGrade.Text;
                    pHeat.Value = txtHeat.Text;
                    pAnsiAsme.Value = cmbANSI.Text;
                    pPurchaseOrder.Value = txtPurchaseOrder.Text;
                    pStandard.Value = cmbStandard.Text;
                    pNotes.Value = txtNotes.Text;

                    cmd.Parameters.Add(pManufactuter);
                    cmd.Parameters.Add(pMillLocation);
                    cmd.Parameters.Add(pProductDescription);
                    cmd.Parameters.Add(pWeldSeamType);
                    cmd.Parameters.Add(pOuterDimension);
                    cmd.Parameters.Add(pWallThickness);
                    cmd.Parameters.Add(pCoating);
                    cmd.Parameters.Add(pGrade);
                    cmd.Parameters.Add(pHeat);
                    cmd.Parameters.Add(pAnsiAsme);
                    cmd.Parameters.Add(pPurchaseOrder);
                    cmd.Parameters.Add(pStandard);
                    cmd.Parameters.Add(pNotes);

                    int result = ((int)cmd.ExecuteScalar());

                    txtReturnFromSelect.Text = result.ToString();

                    cmd.ExecuteNonQuery();
                }
            }
            catch (SqlException ex)
            {
                //catch error
                MessageBox.Show(ex.Message);
            }

注意

数据库当前只包含数字和文本字符串,没有用于测试目的的空格。例如,我创建了一行只有单词" foo"和另一行只有#34; bar"不是" foo"和" bar"在数据库的任何其他行中,但它从输入返回ID -5行,这些行 ONLY 包含数字。这在我的SQL查询和应用程序中都会发生。

更新

我不知道问题是什么,但我放弃了表格并使用相同的查询重新制作它们现在没有问题......最初创建表格时可能会出现侥幸?

4 个答案:

答案 0 :(得分:2)

您的sql语句可能会返回给定代码的多条记录,因此执行ExecuteScalar没有意义,因为它只返回数据库中的单个值(第一列第一行)。最好打开数据读取器或填充数据集并从那里读取数据。

答案 1 :(得分:1)

如果要执行语句并返回多行,请使用ExecuteReader

var reader = command.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine(reader["Column1Name"].ToString());
    Console.WriteLine(reader["Column2Name"].ToString());
}

如果您只想返回第一列中的第一个值,那么您使用ExecuteScalar是正确的。但是,不需要第二个执行语句(执行非查询)。

如果ExecuteScalar是正确的,但您返回的值不正确 - 您的查询或数据错误。首先在SQL Server管理工作室中直接构建查询,以确保它正常工作,然后对其进行编码。

答案 2 :(得分:1)

你看过这些数据了吗?在停止的数据中是否可能存在未转义的非法字符?

答案 3 :(得分:0)

我只是在想......你不需要%的命令!你希望相似的字符串每边一个 - %,其中的东西就像“%word%”??????