解决 与SQLite一起使用的最佳ORM

已加入
2020年3月20日
留言内容
65
编程经验
10+
大家好

我有福彩12选5走势图C#应用程序,我想连接到SQLite数据库,我最初想使用EntityFrameWork 6,因为我对此很熟悉,但是在最新版本的VS2019中它似乎不适用于SQLite。有人可以建议下福彩12选5走势图最佳选择吗,似乎很多,Dapper,NHibernate等。

非常感谢。
AJ
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
不惜一切代价避免EF。避免...避免...避免...避免...

您可以在此处尝试一些建议。 Sqlite C#ORM代码生成的任何建议

为什么在安装应用程序时不使sqlexpress成为先决条件?
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
嗨道林斯

谢谢您的链接,我将为您提供建议。
我经常使用sqlexpress,但想深入研究SQLite,我正在测试ado.net,但无法退出以查找我正在寻找的东西或使用的东西。我有很长的VB6背景,我在这里所做的工作是创建用于读取数据和写入数据的功能。

我将设置我的连接字符串,并具有打开连接,读取,写入和删除的例程。我在ado.net上看了很多教程,但是每个人似乎每次都写出他们的连接和命令参数。下面的示例非常易于使用,但是我在ado.net上找不到找到这种方法的方法,再加上这些天来一切似乎都是关于ORM的,所以最好还是顺其自然。

VB.NET:
Public Sub ReadServer(ByVal Query As String)
    If rs.State = 1 Then
        rs.Close
    End If

    rs.Open Query, cnnMain, adOpenStatic, adLockReadOnly
End Sub
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
与Dapper一起使用-在论坛上搜索我的名字和EF。您会发现很多帖子,为什么我不对EF持高度重视,而所有这些都是有充分理由的。

但是每个人似乎每次都会写出他们的连接和命令参数。
这就是为什么我要为SQL和MySQL创建福彩12选5走势图单独的库,该库仅根据您提供的SQL语句为您完成所有参数构建,连接和命令构建。当我完成工作时,这是另福彩12选5走势图梦想,因为我的项目仍在开发中,可以追溯到2016年,有些甚至是2012年,因为过去几年来没有时间来完成它们。 haha但是,当我这样做时,我将在这里发布它们。最终,我想为其添加映射数据库并为您生成C#所需类的功能。但这不会在以后发布更多版本。

同时,避免使用EF并给Sonic或Dapper打个针。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
哈哈你会很幸运的,如果我能找到时间完成它 @AlexJames. :翻白眼:

如果您需要其他任何ORM的帮助,则应选择福彩12选5走势图。让我们知道

总是很乐意提供帮助。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我认为两者 @谢平 而且我被EF的错误/古怪的行为深深地烧死了。
 

尼尔

论坛管理员
工作人员
已加入
2011年4月15日
留言内容
147
地点
VA
编程经验
10+
您用什么代替它?我知道nopCommerce放弃了它,而不再记得LinqToDB或其他我认为的东西。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我将db4o用于个人项目。 db4o是福彩12选5走势图面向对象的数据库。当您可以始终保持面向对象时,为什么还要使用对象到关系映射器。遗憾的是,即使在Android顽固派中,对db4o的支持也已消失。

对于与工作有关的东西,我的后端数据通常是SharePoint,而不是SQL,因此ORM对我来说毫无用处,无论如何我都必须手写我的“对象到共享点列表”项。几次需要使用SQL,我只使用原始SQL并手写对象。这些项目还不足以保证进行ORM。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
你为什么要发表这个声明?
如果您清楚:
在论坛中搜索我的名字和EF。您会找到一些帖子,说明为什么我不高度重视EF,而这都是有充分理由的。
我从来都不是EF的狂热者,只要有手臂,我就会列出一系列问题。我提交的错误从未得到修复,即使今天我也已经报告了这些错误,但仍然存在内存泄漏。如果要求我根据雇主的指示使用EF,我只是拒绝使用EF,并根据我的发现咨询他们,通常会说服他们使用替代方法。我可能应该在上面说过,但是我不需要,因为我注意到OP之前正在阅读福彩12选5走势图主题,以前我已经给出了不使用EF的理由。因此,没有理由进行详细说明。这里有替代方案的列表: 有哪些好的实体框架替代品

我偏好Dapper。
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
哈哈你会很幸运的,如果我能找到时间完成它 @AlexJames. :翻白眼:

如果您需要其他任何ORM的帮助,则应选择福彩12选5走势图。让我们知道

总是很乐意提供帮助。

谢谢Sheepings,我目前正在研究Dapper,但正在努力寻找有关如何布局结构的不错的教程,如果我有福彩12选5走势图"models", "entities"像EF这样具有不同类的文件夹?我对C#还是比较陌生,真的很想从一开始就以正确的方式来做。如果您可以建议或指导我如何正确使用,我将不胜感激。
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
我决定放弃ORM的想法,坚持使用我熟悉的方法,我正在使用ADO.NET进行CRUD或数据库连接类,并创建可以传递sql查询的方法。现在开始进行测试,请告诉我以下代码中是否有需要改进的地方,或者如果有任何错误之处请我告诉我。

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SQLite;

namespace MyTradeJournal.WinForms.SQLite
{
    public class DatabaseConnection
    {
        private readonly SQLiteConnection sqlConn;
        /// <summary>
        /// Place the connection string inside the constuctor.
        /// </summary>
        public DatabaseConnection()
        {
            SQLiteConnection sQLiteConnection =新的SQLiteConnection(@"数据源= C:\ PosData \ TradeJournal.db;版本= 3;");
            sqlConn = sQLiteConnection;
        }

        public void WriteData(string Query)
        {
            if (sqlConn.State == System.Data.ConnectionState.Closed)
            {
                sqlConn.Open();
            }
            using (SQLiteCommand cmd = new SQLiteCommand(Query, sqlConn))
            {
                cmd.ExecuteNonQuery();
            }
        }

        public SQLiteDataReader ReadData(string Query)
        {
            using (SQLiteCommand cmd = new SQLiteCommand(Query, sqlConn))
            {
                SQLiteDataReader dr = cmd.ExecuteReader();
                return dr;
            }
        }

        public void CloseConnection()
        {
            if (sqlConn.State == System.Data.ConnectionState.Open)
            {
                sqlConn.Close();
            }
        }
    }
}

谢谢
AJ
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
以上似乎不错,但是您的参数在哪里?

仅仅因为它是本地数据库,并不意味着您应该放松安全性。

SQLiteConnection sQLiteConnection =新的SQLiteConnection(@"数据源= C:\ PosData \ TradeJournal.db;版本= 3;");
为什么不删除它并从需要的任何方法中调用新连接?

这是我写出的用于测试具有用户注册过程的客户应用程序的方法:

C#:
        public void Create_NewUser(TextBox[] tb_controls)
        {
            using (SQLiteConnection liteConnection = new SQLiteConnection(Con_String))
            {
                if (liteConnection.State == System.Data.ConnectionState.Closed)
                    liteConnection.Open();
                Command = "INSERT INTO users (username, email, password, name, company_name) VALUES (@username, @email, @password, @name, @company_name)";
                SQLiteCommand liteCommand = new SQLiteCommand();
                liteCommand.CommandText = Command;
                liteCommand.Connection = liteConnection;
                liteCommand.Parameters.AddWithValue("@username", tb_controls[0].Text);
                liteCommand.Parameters.AddWithValue("@email", tb_controls[1].Text);
                liteCommand.Parameters.AddWithValue("@password", Security.Secure_Password);
                liteCommand.Parameters.AddWithValue("@name", tb_controls[3].Text);
                liteCommand.Parameters.AddWithValue("@company_name", tb_controls[4].Text);
                liteCommand.ExecuteNonQuery();
            }
        }
稍后,我将介绍福彩12选5走势图用于数据的模型,以将数据往来于控件,以及从控件中拉出数据,而不是将控件传递给参数,而只是传递模型。

关于Dapper。通常,我建议人们不要使用Youtube教程,但是网上有一些不错的教程。例如,蒂姆·科里通常会举一些很好的例子: 精巧的教程C#-YouTube -在Google和Bing上进行进一步搜索还会为初学者提供大量信息。
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
嗨道林斯

因此,如果我正确理解的话,就不能只具有可以通过sql查询的通用读写数据方法?每个数据库表都必须有福彩12选5走势图单独的类吗?像上面的示例一样,如果我有三个数据库表,例如"products", "Users", "Exchanges"我需要为每个表提供福彩12选5走势图类,并且每个类将包含INSERT,UPDATE和DELETE的方法?这似乎是很多重复的工作。在下面的示例中,我可以调用该方法并将查询以任何形式传递给它。

C#:
       private void CmdSave_Click(object sender, EventArgs e)
        {
            DatabaseConnection myDbConn = new DatabaseConnection();
            myDbConn.WriteData("INSERT INTO ExchangeSetup " +
                                  "(ExchangeName " +
                                  ",ExchangeAPIKey " +
                                  ",ExchangeSecret) " +
                               "VALUES " +
                                  "('" + CboExchange.Text +  "' " +
                                  ",'" + TxtApiKey.Text + "' " +
                                  ",'" + TxtApiSecret.Text + "')");

            myDbConn.CloseConnection();
            PopulateGrid();
        }

如果我误会你道歉
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
代码的问题在于,它使您容易受到SQL注入攻击的侵害,并且如果您以后决定将其从本地数据库迁移到远程数据库,则可以利用您的数据库。
你能做的是创建自己的参数数组,然后在基于语句构造它们之后,就可以将它们传递到write方法中。您的write方法将需要更改以读​​取参数和值:
C#:
                SQLiteParameter[] parameters = { new SQLiteParameter
                {
                    ParameterName = "foo",
                    Value = "bar"
                }};
There is also SQLiteParameterCollection which allows you to AddRange such as a parameter array.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
没问题。

现在您知道我为什么选择创建这个新库了。 :凉爽的:

如果您需要任何其他帮助。让我们知道
 
最佳 底部