我发现了一些我尚未找到解决方案的奇怪行为。当我调试SQL代码时,它返回正确的值,但不知何故,在C#代码中,datatable返回错误的结果。
由于这是计费应用程序而且它有敏感信息,我无法发布整个代码,只有包含有问题代码的方法和返回结果的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返回正确的列名值,datatable也会返回列名 - “NOT”(第二个),我的意思是总是......这不可能是真的,因为我有if / else语句和程序应该避免第二个statemement。如何将数据表对象保存错误的列名?这是一个错误还是因为我正在使用列的别名所以它使用最后一个...?有人有答案吗?
答案 0 :(得分:1)
曾经遇到同样的问题,但不是在C#中:
原因是通过php访问查询结果指针已全部移动,因此始终跳过第一个结果。
听起来像是同一类问题,可能是行数。
(抱歉不能发表评论)
答案 1 :(得分:1)
ADO.NET正在缓存从存储过程返回的DataTable结构(列名和类型)。基于业务逻辑更改表结构并不是一个好主意 - 而是改变数据而不是结构。 我建议你更改sp,以便它总是返回相同的列名,例如&#34;状态&#34;但值会根据您的业务逻辑而变化。
--SQL logic
if (errorCondition)
SELECT 'ERROR' as Status, 'Error message' as Message
if @Date <> @Today
SELECT 'Yes' AS Status, '' AS Message
else
SELECT 'No' AS Status, '' as Message
然后你的C#逻辑变得更简单了: