gpt4 book ai didi

c# - 如何使用自定义 DbDataReader 填充表值参数?

转载 作者:行者123 更新时间:2023-11-30 15:58:39 27 4
gpt4 key购买 nike

根据 MSDN , System.Data.SqlClient支持从 DataTable 填充表值参数, DbDataReaderIEnumerable<SqlDataRecord>对象。

我编写了以下代码,使用 IEnumerable<SqlDataRecord> 填充表值参数对象:

static void Main()
{
List<int> idsToSend = ...
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(@"SELECT ...
FROM ...
INNER JOIN @ids mytable ON ...", connection);

command.Parameters.Add(new SqlParameter("@ids", SqlDbType.Structured)
{
TypeName = "int_list_type",
Direction = ParameterDirection.Input,
Value = GetSqlDataRecords(idsToSend) //returns IEnumerable<SqlDataRecord>
});

SqlDataReader reader = command.ExecuteReader();
//consume reader...
}
}

它工作得很好。

MSDN页面说:

You can also use any object derived from DbDataReader to stream rows of data to a table-valued parameter.

我想使用自定义 DbDataReader而是传递行数据。像这样:

public class CustomDataReader : DbDataReader
{
public CustomDataReader(IEnumerable<int> values)
{
}

//implementation of other abstract methods and fields required by DbDataReader
//...
}

我在初始代码示例中更改了以下行:

Value = GetSqlDataRecords(idsToSend)
=>
Value = new CustomDataReader(idsToSend)

如果我运行代码,它会在执行 command.ExecuteReader() 期间给我以下异常:

An unhandled exception of type 'System.NotSupportedException' occurred in System.Data.dll Additional information: Specified method is not supported.

我已经在我的 CustomDbDataReader 的所有方法和属性上设置了一个断点class :在我得到异常之前它们都没有被调用所以它可能与 DbDataReader 的实现无关


编辑:这里是堆栈跟踪,按照要求:

   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at ConsoleApplication211.Program.Main() in Program.cs:line 51
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

最佳答案

关于c# - 如何使用自定义 DbDataReader 填充表值参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42908984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com