gpt4 book ai didi

ms-access - Dapper 扩展 Ms Access System.Data.OleDb.OleDbException

转载 作者:行者123 更新时间:2023-12-02 15:18:02 24 4
gpt4 key购买 nike

我刚开始使用 Dapper。 Dapper 工作正常。作为下一步,当我尝试与 Dapper Extension 集成时。它会生成一个名为 System.Data.OleDb.OleDbException “附加信息:在 SQL 语句结束后找到的字符。” 的异常,这是为什么呢? Dapper Extension 不支持 Ms Access(因为结束字符)或我的代码有问题或我遗漏了一些东西。我的代码在下面

using (var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myAccessFile.accdb;"))
{
conn.Open();
conn.Insert<Person>(new Person { Name = "John Stan", Age = 20 });
}

最佳答案

根据 MSDN article ,

Some database engines, such as the Microsoft Access Jet database engine, do not support output parameters and cannot process multiple statements in a single batch.

所以问题是 Insert 方法正在生成如下语句

INSERT INTO [Person] ([Person].[PersonName]) VALUES (@PersonName);
SELECT CAST(SCOPE_IDENTITY() AS BIGINT) AS [Id]

Access 无法处理它。

四处阅读,似乎有各种关于在处理 Access 时如何执行 insert-and-get-new-record-key 的建议(MSDN 文章建议使用第二个 SELECT 语句),但如果您正在使用 DapperExtensions 库,因为它会为您生成查询。

所以,基本上,我认为您认为 DapperExtensions 不适用于 Access 是正确的。


附带说明一下,我做了一场噩梦,试图找出正在生成的查询。有很多文章讨论了如何通过注册表破解将“JETSHOWPLAN”值设置为“ON”,但我无法使它们中的任何一个起作用。最后,我创建了包装的数据库连接和命令类,以便可以在出路时捕获查询。如果这对将来的任何人都有用,我将其包含在下面..

数据库连接初始化代码需要稍微改变——例如。

var connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database2.mdb;";
using (var conn = new WrappedDbConnection(new OleDbConnection(connectionString)))
{
conn.Insert<Person>(new Person { PersonName = "Dan" });
}

并且需要定义下面两个类-

public class WrappedDbConnection : IDbConnection
{
private readonly IDbConnection _conn;
public WrappedDbConnection(IDbConnection connection)
{
if (connection == null)
throw new ArgumentNullException(nameof(connection));

_conn = connection;
}

public string ConnectionString
{
get { return _conn.ConnectionString; }
set { _conn.ConnectionString = value; }
}

public int ConnectionTimeout
{
get { return _conn.ConnectionTimeout; }
}

public string Database
{
get { return _conn.Database; }
}

public ConnectionState State
{
get { return _conn.State; }
}

public IDbTransaction BeginTransaction()
{
return _conn.BeginTransaction();
}

public IDbTransaction BeginTransaction(IsolationLevel il)
{
return _conn.BeginTransaction(il);
}

public void ChangeDatabase(string databaseName)
{
_conn.ChangeDatabase(databaseName);
}

public void Close()
{
_conn.Close();
}

public IDbCommand CreateCommand()
{
return new WrappedDbCommand(_conn.CreateCommand());
}

public void Dispose()
{
_conn.Dispose();
}

public void Open()
{
_conn.Open();
}
}

public class WrappedDbCommand : IDbCommand
{
private readonly IDbCommand _cmd;
public WrappedDbCommand(IDbCommand command)
{
if (command == null)
throw new ArgumentNullException(nameof(command));

_cmd = command;
}

public string CommandText
{
get { return _cmd.CommandText; }
set { _cmd.CommandText = value; }
}

public int CommandTimeout
{
get { return _cmd.CommandTimeout; }
set { _cmd.CommandTimeout = value; }
}

public CommandType CommandType
{
get { return _cmd.CommandType; }
set { _cmd.CommandType = value; }
}

public IDbConnection Connection
{
get { return _cmd.Connection; }
set { _cmd.Connection = value; }
}

public IDataParameterCollection Parameters
{
get { return _cmd.Parameters; }
}

public IDbTransaction Transaction
{
get { return _cmd.Transaction; }
set { _cmd.Transaction = value; }
}

public UpdateRowSource UpdatedRowSource
{
get { return _cmd.UpdatedRowSource; }
set { _cmd.UpdatedRowSource = value; }
}

public void Cancel()
{
_cmd.Cancel();
}

public IDbDataParameter CreateParameter()
{
return _cmd.CreateParameter();
}

public void Dispose()
{
_cmd.Dispose();
}

public int ExecuteNonQuery()
{
Console.WriteLine($"[ExecuteNonQuery] {_cmd.CommandText}");
return _cmd.ExecuteNonQuery();
}

public IDataReader ExecuteReader()
{
Console.WriteLine($"[ExecuteReader] {_cmd.CommandText}");
return _cmd.ExecuteReader();
}

public IDataReader ExecuteReader(CommandBehavior behavior)
{
Console.WriteLine($"[ExecuteReader({behavior})] {_cmd.CommandText}");
return _cmd.ExecuteReader();
}

public object ExecuteScalar()
{
Console.WriteLine($"[ExecuteScalar] {_cmd.CommandText}");
return _cmd.ExecuteScalar();
}

public void Prepare()
{
_cmd.Prepare();
}
}

现在,查询在发送到数据库之前先写入控制台。

关于ms-access - Dapper 扩展 Ms Access System.Data.OleDb.OleDbException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39199191/

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