0

我的 c# 应用程序真的很难。每次我运行下面的代码时,它都会给我一个关于将 nvarchar 数据类型转换为 int 的错误。我试过铸造,但它似乎不起作用。

ConnectionString myConnString = new ConnectionString();
string connString = myConnString.getConnectionString();
SqlConnection connValidate = new SqlConnection(connString);

SqlCommand cmdValidate = new SqlCommand("XXX", connValidate);
cmdValidate.CommandType = CommandType.StoredProcedure;

cmdValidate.Parameters.Add(new SqlParameter("@AccountID", currentUser));
cmdValidate.Parameters.Add(new SqlParameter("@PeriodMonth", Convert.ToString(comboBoxMonth.SelectedItem).Trim().ToUpper()));
cmdValidate.Parameters.Add(new SqlParameter("@PeriodYear", Convert.ToInt32(comboBoxYear.SelectedValue)));

connValidate.Open();

Int32 result = Convert.ToInt32(cmdValidate.ExecuteScalar());

connValidate.Dispose();
connValidate.Close();

这是我正在使用的存储过程:

ALTER PROCEDURE [dbo].[XXX]
    @AccountID char(6),
    @PeriodMonth char(10),
    @PeriodYear int,
    @Date int,
    @PeriodID int,
    @InventoryID int,
    @ProductOutID int
AS
    SELECT @PeriodID = PeriodID FROM Periods
    WHERE PeriodMonth = @PeriodMonth AND PeriodYear = @PeriodYear AND AccountID = @AccountID

    SELECT @InventoryID = InventoryID FROM Fact 
    WHERE PeriodID = @PeriodID AND AccountID = @AccountID

    SELECT @ProductOutID = ProductOutID FROM Inventory
    WHERE InventoryID = @InventoryID

    SELECT DailyOutID FROM DailyOut
    WHERE ProductOutID = @ProductOutID AND Date = @Date
RETURN

我在这里要做的是检查用户输入的同年同月的时间段是否已经存在于数据库中。所以基本上,如果输入的周期已经存在,存储过程应该返回一个值,如果存在,那么MessageBox将向用户显示一个值,提醒用户存在相同的周期。非常感谢!:)

4

4 回答 4

0

尝试使用像@DailyOutID 这样的输出参数

SELECT @DailyOutID =  Cast(DailyOutID As Int) FROM DailyOut 
WHERE ProductOutID = @ProductOutID AND Date = @Date

并从 cmdValidate.Parameters 的参数集合中读取参数

于 2010-10-07T14:19:11.483 回答
0
  1. 启动 SQL Profiler,以便您可以捕获发送到服务器的确切sql。
  2. 将该 sql 复制并粘贴到查询分析器或 SQL 管理工作室中。
  3. 运行它,最好在调试模式下运行,并告诉我们哪个行号有问题。

我的猜测是 Periods.PeriodMonth 不是 char(10),但我需要查看错误在哪一行。

于 2010-10-07T05:00:04.987 回答
0

尝试这个:

Int32 result = Int32.Parse(cmdValidate.ExecuteScalar());
于 2010-10-07T05:01:01.083 回答
0

首先,验证 cmdValidate.ExecuteScalar() 是否返回您认为的值。我猜问题出在您的存储过程中。如果是这样,您可能想发布一个带有不同标签的新问题。

于 2010-10-07T14:05:48.810 回答