DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.17k stars 1.32k forks source link

关于使用SqlSugar ODBC 连接数据库问题的详细描述 #1255

Closed JimmyTsai75 closed 1 week ago

JimmyTsai75 commented 1 week ago

非常感谢这么快速的回复我上一个问题。 我现在把我的代码重新贴一遍:

using SqlSugar;
using SqlSugar.Odbc;
using System.Diagnostics;

namespace SugarOdbcTest
{
    public partial class Form1 : Form
    {
        public SqlSugarClient db;
        public Form1()
        {
            InitializeComponent();
            //这行代码扔程序启动时
            InstanceFactory.CustomAssemblies = new System.Reflection.Assembly[] { typeof(OdbcProvider).Assembly};
            //按文档入门使用
            db = new SqlSugarClient(new ConnectionConfig()
            {
                DbType = DbType.Odbc,
                ConnectionString = "Dsn=SendMail;DataBase=SqlEmail;",
                IsAutoCloseConnection = true,
                AopEvents = new AopEvents
                {
                    OnLogExecuting = (sql, p) =>
                    {
                        //这个地方设置断点,debug的时候有输出相关的sql语句
                        Debug.WriteLine(sql);
                    }
                }
            });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //var intValue=db.Ado.SqlQuerySingle<int>("select 1 from EmailInfo"); //这句可以正常返回 1

            //var list = db.Ado.GetDataTable("select * from EmailInfo");//这句运行后就会出现一直等待            
            var res = db.Ado.SqlQuerySingle<dynamic>("select * from EmailInfo");//这句运行后也会出现一直等待
            Debug.WriteLine("OK");
        }
    }
}

我的项目采用.net framework 6.0 在NuGet里面安装的依赖性是SqlSugar.OdbcCore 和 SqlSugarCore 我的ODBC 采用用户Dsn,这个SendMail测试是正常的,并且var intValue=db.Ado.SqlQuerySingle("select 1 from EmailInfo"); 这个语句可以正常返回也说明这个Dsn是可以的

现在的问题就是如果我是执行类似db.Ado.GetDataTable("select * from EmailInfo"); 这样的语句,就会出现一直等待的情况,没有采用异步操作,如果我把button1_Click改成async/await 也是一样的不可以

DotNetNext commented 1 week ago

用原生DataReader测试 ,那基本可以确定是原生就不支持了 可能你这个DSN比较特别,其他数据库ODBC是可以的

DotNetNext commented 1 week ago

var dr=db.Ado.GetDataReader(); while(dr.Read()) { xxxx }

JimmyTsai75 commented 1 week ago

找到原因了,我的数据库是mssql,我的Email这个表里面有一个字段EmailContent 这个字段的类型是text类型,里面的数据一行有3000多个字,我如果执行select top 2 [email_content] from EmailInfo 遇到有3000多个汉字的那个字段就会出现一直等到的情况,如果我不是使用odbc链接,这种情况是没有问题的

SC.Context = new SqlSugarClient(new ConnectionConfig()
                    {
                        DbType = SqlSugar.DbType.SqlServer,
                        IsAutoCloseConnection = true,
                        ConnectionString = AppConfig.ConnectionString,
                    });

但是如果我使用odbc连接,就会出现select里面有这种文字比较多的数据就会一直等待,请问这个有没有什么办法可以解决

JimmyTsai75 commented 1 week ago

找到解决办法了,升级ODBC驱动就可以了。另外有个新的问题:我用odbc连接的时候,我要如何让程序知道我连接的数据库时mssql。 我现在执行var list = db.Queryable().ToPageList(1, 5);的时候,我跟踪到的sql语句是用limit 来分页的,这个mssql里面是不支持的,我应该怎么配置才能让ToPageList正确解析成mssql语句的分页指令

DotNetNext commented 1 week ago

我这个我支持一下吧,现在支持 databasemodel, 可以满足你需求 明天给你发布个版本

JimmyTsai75 commented 1 week ago

好的,太感谢了!

DotNetNext commented 1 week ago
    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
        DbType = DbType.Odbc,
        ConnectionString = Config.ConnectionString, 
        IsAutoCloseConnection = true,
        MoreSettings=new ConnMoreSettings() 
        {
                DatabaseModel=DbType.SqlServer
        }
    });

更新到这个版本 ,配置databasemodel支持了sqlserver分页 【 SqlSugar.OdbcCore 5.1.4.160】

JimmyTsai75 commented 1 week ago

非常感谢,使用新版本之后,问题解决!!

Yoodanet commented 1 week ago
    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
        DbType = DbType.Odbc,
        ConnectionString = Config.ConnectionString, 
        IsAutoCloseConnection = true,
        MoreSettings=new ConnMoreSettings() 
        {
                DatabaseModel=DbType.SqlServer
        }
    });

更新到这个版本 ,配置databasemodel支持了sqlserver分页 【 SqlSugar.OdbcCore 5.1.4.160】

我设置了这个,但是我的数据库时SQL Server2008 ,不支持Offset Fetch Next ,那么这个时候如何使用ToPageList 呢?谢谢!

DotNetNext commented 1 week ago
    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
        DbType = DbType.Odbc,
        ConnectionString = Config.ConnectionString, 
        IsAutoCloseConnection = true,
        MoreSettings=new ConnMoreSettings() 
        {
                DatabaseModel=DbType.SqlServer
        }
    });

更新到这个版本 ,配置databasemodel支持了sqlserver分页 【 SqlSugar.OdbcCore 5.1.4.160】

我设置了这个,但是我的数据库时SQL Server2008 ,不支持Offset Fetch Next ,那么这个时候如何使用ToPageList 呢?谢谢!

你们是一个人吗?不是一个人最好发新的issue 这个都关闭了。 这个是ODBC连接 ,你不会这么巧也需要用ODBC链接吧

DotNetNext commented 1 week ago

关闭的我可能会忘记查看

JimmyTsai75 commented 1 week ago

我们不是同一个人