我有一個SQL語句,我需要在C#中運行,並需要從C#代碼中獲取參數。我知道存儲過程是避免SQL注入的首選,但我只是想在C#中做到這一點。C#運行臨時存儲過程
我正在將此SQL轉換爲C#,但即使查詢在SQL Server Management Studio中工作,我也遇到了一個錯誤。它使用臨時存儲的過程及以下臨時表:
-- 1.) Declare a criteria table which can be any number of rows
BEGIN TRY
DROP TABLE #CriteriaTable
END TRY
BEGIN CATCH
END CATCH
CREATE TABLE #CriteriaTable (ParameterCode VARCHAR(64), Value VARCHAR(64))
-- 2.) Declare a procedure to add criteria table
BEGIN TRY
DROP PROCEDURE #AddCriteriaTable
END TRY
BEGIN CATCH
END CATCH
go
CREATE PROCEDURE #AddCriteriaTable
(@ParameterCode VARCHAR(64), @Value VARCHAR(64))
AS
INSERT #CriteriaTable
VALUES(@ParameterCode, @Value)
GO
-- 3.) Do a computation which accesses the criteria
BEGIN TRY
DROP PROCEDURE #ComputeBasedOnCriteria
END TRY
BEGIN CATCH
END CATCH
go
CREATE PROCEDURE #ComputeBasedOnCriteria
(@product VARCHAR(36) = 'ABC',
@currency VARCHAR(3) = 'USD',
@zScore FLOAT = .845)
AS
-- Code inside this procedure is largely dynamic sql.
-- This is just a quick mock up
SELECT
@Product ProductCode,
@currency Currency,
950 ExpectedRevenue,
*
FROM
#CriteriaTable c
PIVOT
(min (Value) FOR ParameterCode IN
([MyParam1], MyParam2, MyParam3)
) AS pvt
GO
--End of code for Configuration table
-- Samples: Execute this to add criteria to the temporary table that will be used by #ComputeBasedOnCriteria
EXEC#AddCriteriaTable 'MyParam1', 'MyValue1'
EXEC#AddCriteriaTable 'MyParam2', 'MyValue3'
EXEC#AddCriteriaTable 'MyParam3', 'MyValue3'
--Execute the procedure that will return the results for the screen
EXEC#ComputeBasedOnCriteria
現在試圖在C#我遇到一個錯誤,當我嘗試運行#AddCriteriaTable
程序。當我嘗試在第二的ExecuteQuery
運行它拋出的最後一行:
異常信息:System.Data.SqlClient.SqlException,關鍵字「PROC」附近有語法錯誤。
爲什麼它在SQL Server中工作,但不在C#代碼中?有沒有另一種方式在C#中做到這一點?讓我知道是否有C#指導我應該遵循,因爲我仍然在學習這個C# - 數據庫工作。
編輯: 我知道我可以做到這一點作爲一個正常的存儲過程,並通過在一個DataTable但有團隊的問題,我不能說,它迫使我使用SP爲文本。
即時猜測有
CREATE PROC
你得到一個錯誤的越多,你怎麼做C#調用這就是問題。在最後一個執行#computebasedoncritieria之前的所有行將執行查詢,行,最後一行將需要一個普通的查詢來獲取數據 - 你可以顯示你的C#代碼 – BugFinder我粘貼包含我的C#代碼的圖像。我還沒有編寫#computebasedoncritieria;執行#AddCriteriaTable會引發錯誤。 –
鄙視你的代碼Id沒有期望像你這樣做你的程序,因爲你似乎稱它爲你,你希望你用另一個execnoquery做它,然後運行它..它似乎有一個混合在那最後一組命令 – BugFinder