【发布时间】:2020-09-15 05:34:44
【问题描述】:
我有这个 SQL 查询脚本,我试图通过 ADO.Net 代码调用它。
DECLARE
@Error NVARCHAR(MAX)
DECLARE
@Errors TABLE
(
[Column_Name] VARCHAR(MAX),
[Message] VARCHAR(MAX)
)
IF NOT EXISTS(...)
BEGIN
INSERT INTO @Errors
SELECT
'Col1',
'value does not exist.'
END
IF NOT EXISTS(...)
BEGIN
INSERT INTO @Errors
SELECT
'Col2',
'value does not exist.'
END
IF EXISTS (SELECT * FROM @Errors)
BEGIN
SET @Error = (
SELECT
[Column_Name],
[Message]
FROM
@Errors
FOR JSON PATH, INCLUDE_NULL_VALUES
);
SELECT @Error AS 'Error_Message'
END
ELSE
BEGIN
SELECT TOP(1) Id
FROM dbo.table
END
这是 C# 代码
using (var conn = await _connectionFactory.OpenConnectionAsync(database: "dbName", readOnly: true))
{
using (var cmd = conn.CreateCommandFromSqlFile(path, "test.sql"))
{
string errors = string.Empty;
Guid id;
using (DataReader reader = await cmd.ExecuteReaderAsync(ct))
{
if (reader.HasRows)
{
while (await reader.ReadAsync(ct))
{
errors = reader.GetString("Error_Message");
id = reader.GetGuid("Id");
}
}
}
}
}
SQL 脚本始终根据条件返回Error_Message 或Id。如果填充了@Errors 表,则返回Error_Message,如果没有错误,则返回Id。
我试图在 c# 代码中获取这些值,但它在 while 块中引发异常,因为其中一个值,Error_Message 或 Id 将不存在。
我需要帮助才能将这些值优雅地添加到我的 C# 代码中。有办法吗?
【问题讨论】:
-
使用输出参数。
-
@DaleK - SQL 脚本不是存储过程或函数,它只是一个普通的 SQL 脚本。
-
所以?您可以将参数与普通 SQL 一起使用...我一直将它们用于少数返回值,因为您不需要阅读器和/或 DataTables 等,它们的性能更好。
标签: c# sql-server ado.net