【发布时间】:2014-12-17 13:41:25
【问题描述】:
我发现了一些我还没有找到解决方案的奇怪行为。当我调试 SQL 代码时,它返回正确的值,但是在 C# 代码中,数据表返回错误的结果。
由于这是计费应用程序并且它包含敏感信息,我无法发布整个代码,只能发布包含有问题代码的方法和返回结果的 SQL 存储过程。
SQL:
ALTER PROCEDURE [dbo].[conf_SetRationCurrency]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Date AS VARCHAR(10),
@Today AS VARCHAR(10)
SELECT @Date = CONVERT(VARCHAR(10),[date], 112) FROM RatioCurrency
SELECT @Today = CONVERT(VARCHAR(10),GETDATE(),112)
BEGIN TRAN
BEGIN TRY
IF @Date <> @Today
BEGIN
-- INSERT
INSERT INTO dbo.RatioCurrency
SELECT rateType, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS SMALLDATETIME) AS [date],fromCurrency,toCurrency,value
FROM dbo.RatioCurrency where [date] =
(
SELECT TOP 1 CAST(CONVERT(VARCHAR, [date], 112) AS SMALLDATETIME) AS [date]
FROM dbo.RatioCurrency
ORDER BY ID DESC
)
SELECT 'Yes' AS 'INSERTED' -- return flag for setting output text in code
END
ELSE
BEGIN
SELECT 'No' AS 'NOT' -- return flag for setting output text in code
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN
EXEC dbo.intf_ShowError
RETURN
END CATCH
COMMIT
END
C#:
DialogResult dialog = MessageBox.Show("Da li želite kopirati valutu zadnjeg unosa za današnji dan...?","Upit",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialog == DialogResult.Yes)
{
DataTable dt = Program.ExecProc("conf_SetRationCurrency");
if (dt.Rows.Count > 0 && dt.Columns[0].ColumnName == "ErrorNumber")
{
Program.ShowDataInfoError(dt.Rows[0]); //print error message
}
else if (dt.Rows.Count > 0 && dt.Columns[0].ColumnName == "NOT") //part which should only give info that value is already in the database, no need to insert new one.
{
SplashForm sf = new SplashForm();
sf.informationText.Text = "Valuta već postoji.";
sf.Show();
GetCurrency();
this.Refresh();
}
else // this part actually gives info that new values are inserted
{
SplashForm sf = new SplashForm();
sf.informationText.Text = "Valuta je upisana.";
sf.Show();
GetCurrency();
this.Refresh();
}
}
else
{
return;
}
即使 SQL 返回了正确的列名值,数据表也返回了列名 - “NOT”(第二个),我的意思是总是......这不可能是真的,因为我有 if/else 语句并且程序应该避免第二个声明。数据表对象怎么会持有错误的列名?这是一个错误还是因为我使用列的别名所以它使用最后一个......?有人回答吗?
【问题讨论】: