【问题标题】:SQLite Connection not working in C#SQLite 连接在 C# 中不起作用
【发布时间】:2020-04-27 08:25:25
【问题描述】:

我正在使用操作 SQLite 数据库的 C# 应用程序,直到昨天它工作正常,它正在检索记录,

但是从昨晚开始,连接字符串返回Data Source = null

下面是测试代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SQLiteTest
{
    public partial class Form1 : Form
    {
        //string connection_string = "Data Source=UrduDictionary";
        string connection_string = "Data Source=" + Environment.CurrentDirectory + "\\Test.sqlite";
        string query = "";
        private SQLiteConnection _connection;
        private SQLiteCommand _command;
        private SQLiteDataAdapter _adapter;
        DataSet local;
        public Form1()
        {
            InitializeComponent();
        }
    void Make_Connection()
    {
        _connection = new SQLiteConnection(connection_string);
    }
    private void button1_Click(object sender, EventArgs e)
    {                 
         Make_Connection();
    }

}

}

下面是在Watch Window中调试期间看到的图像..

我使用的库是 "SQLite-1.0.66.0-setup.exe"

我已经用其他创建的数据库进行了测试,但结果相同,任何机构都可以提供帮助吗?

【问题讨论】:

  • 尝试添加版本。 "数据源=MyDatabase.sqlite;版本=3;"
  • 您确定该文件存在于“Environment.CurrentDirectory”中并且您有权限?你试过 _connection.Open() 吗?抛出异常?
  • 是的,我有必要的权限,直到昨天它还在工作,当我尝试打开时,它说,“对象引用未设置为实例......”
  • 我做到了,没有运气。
  • 以防万一... var pathDB = System.IO.Path.Combine(Environment.CurrentDirectory, "Test.sqlite"); if (!System.IO.File.Exists(pathDB)) throw new Exception(); var connection_string = String.Format("Data Source={0};Version=3;", pathDB);

标签: c# database sqlite connection-string


【解决方案1】:

这是我所做的:

private void button2_Click(object sender, EventArgs e)
{
    string dbPath = Path.Combine(Environment.CurrentDirectory, "UrduDictionary");
    string connString = string.Format("Data Source={0}", dbPath);

    using (SQLiteConnection conn = new SQLiteConnection(connString))
    {
        StringBuilder query = new StringBuilder();
        query.Append("SELECT * ");
        query.Append("FROM CATIGORY_TABLE ");

        using (SQLiteCommand cmd = new SQLiteCommand(query.ToString(), conn))
        {
            conn.Open();

            using (SQLiteDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    Console.WriteLine("{0} {1} {2}",
                        dr.GetValue(0),
                        dr.GetValue(1),
                        dr.GetValue(2));
                }
            }
        }
    }
}

【讨论】:

  • 太棒了!尝试使用 Path.Combine 和 String.Format 来改进您对字符串的处理。
【解决方案2】:

以防万一……

var pathDB = System.IO.Path.Combine(Environment.CurrentDirectory, "Test.sqlite"); 
if (!System.IO.File.Exists(pathDB)) throw new Exception(); 
var connection_string = String.Format("Data Source={0};Version=3;", pathDB);

【讨论】:

    【解决方案3】:

    这就是我为使用 C# 的 sqlite 连接所做的:

    • 我已经从here 下载了 Sqlite 二进制文件
    • 那么这里是连接Sqlite的代码:
    string dbConnectionString = @"Data Source=Sample.s3db;Version=3;";
    try
    {
        SQLiteConnection sqlite_con = new SQLiteConnection(dbConnectionString);
        sqlite_con.Open();
        string query = "select * from test;";
        SQLiteCommand sqlite_cmd = new SQLiteCommand(query, sqlite_con);
        SQLiteDataReader dr = sqlite_cmd.ExecuteReader();
        while (dr.Read())
        {
            MessageBox.Show(dr.GetString(1));
        }
    
        sqlite_con.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    

    如果有人想在下面的实体框架中使用它是代码(使用EntityFramework version 4.1.0.0 测试)

    模型和数据上下文

    namespace WpfApplication1.Model
    {
        public class Movie
        {
            public Int64 Id { get; set; }
            public string name { get; set; }
        }
        public class MySqliteContext : DbContext
        {
            public DbSet<Movie> Movies { get; set; }
        }
    }
    
    List<Model.Movie> movies = new List<Model.Movie>();
    using (var context = new MySqliteContext())
        movies = context.Movies.ToList();
    
    foreach (var movie in movies)
        MessageBox.Show(movie.name.ToString());
    

    这是包含DbProviderFactories 和DefaultConnectionFactory 的app.config 文件

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="true" />
      </configSections>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
      </startup>
      <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SQLite" />
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"
               type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.84.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
        </DbProviderFactories>
      </system.data>
      <connectionStrings>
        <add name="MySqliteContext" connectionString="Data Source=|DataDirectory|Sample.s3db" providerName="System.Data.SQLite" />
      </connectionStrings>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.SQLite.SQLiteFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
      </entityFramework>
    </configuration>
    

    【讨论】:

    • 感谢详细的回复
    【解决方案4】:

    始终使用最新的稳定版本,在本例中为 1.6.292

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2014-02-26
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多