简体   繁体   English

从sqlite读取数据到C#然后到sqlite

[英]read data from sqlite into C# then to sqlite

Reproducible Example: 可重复的例子:

sqlite db test3.s3db has one table with name "MathRec": sqlite db test3.s3db有一个名为“MathRec”的表:

name score
Bill 2
Mary 3
John 3

Code: 码:

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

namespace ConsoleApplication7

{
    class Program
    {
    static void Main(string[] args)
    {

        string fullPath = "C:\\Users\\Desktop\\dataset\\test3.s3db";
        SQLiteConnection conread = new SQLiteConnection("Data Source=" + fullPath);
        conread.Open();

        string selectSQL = "SELECT * FROM MathRec";
        SQLiteCommand selectCommand = new SQLiteCommand(selectSQL, conread);
        SQLiteDataReader dataReader = selectCommand.ExecuteReader();
        DataSet ds = new DataSet();
        DataTable dt = new DataTable("MathRec");
        dt.Load(dataReader);
        ds.Tables.Add(dt);



        // Create a table in the database to receive the information from the DataSet

        string fullPath2 = "C:\\Users\\\\Desktop\\dataset\\test4.s3db";
        SQLiteConnection conwrite = new SQLiteConnection("Data Source=" + fullPath2);
        conwrite.Open();
        SQLiteCommand cmd = new SQLiteCommand(conwrite);
        cmd.CommandText = "DROP TABLE IF EXISTS MathRec";
        cmd.ExecuteNonQuery();
        cmd.CommandText = "CREATE TABLE MathRec(name text , score integer)";
        cmd.ExecuteNonQuery();
        SQLiteDataAdapter adaptor = new SQLiteDataAdapter("SELECT * from MathRec", conwrite);
        adaptor.InsertCommand = new SQLiteCommand("INSERT INTO MathRec  VALUES(:name, :score)", conwrite);
        adaptor.InsertCommand.Parameters.Add("name", DbType.String, 0, "name");
        adaptor.InsertCommand.Parameters.Add("score", DbType.Int32, 0, "score");
        adaptor.Update(ds, "MathRec");



         }

    }
 }

Questions: Table MathRec is created in test4.s3db with column names: name and socre, but the table is empty with no records inserted. 问题:表MathRec在test4.s3db中创建,列名为:name和socre,但该表为空,未插入任何记录。

Help is needed! 需要帮助!

Please don't ask me why I am just copying one db to another, because I am testing one part of the code for a bigger project, where I will do calculations to the Dataset in the middle step in the future. 请不要问我为什么我只是将一个数据库复制到另一个数据库,因为我正在测试一个更大项目的代码的一部分,我将在未来的中间步骤中对数据集进行计算。

Thanks! 谢谢!


To simplify the question: 为了简化问题:

This works (use datatable and adapter to update the original sqlite table): 这工作(使用数据表和适配器来更新原始的sqlite表):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            string fullPath = "C:\\Users\\data\\test.db";
            SQLiteConnection conread = new SQLiteConnection("Data Source=" + fullPath);
            conread.Open();


        SQLiteDataAdapter DB = new SQLiteDataAdapter("SELECT speed, dist FROM Cars2", conread);
        DataSet DS = new DataSet();

        DB.Fill(DS, "NewCars");


        object[] rowVals = new object[2];
        rowVals[0] = 10;
        rowVals[1] = 20;
        DS.Tables["NewCars"].Rows.Add(rowVals);


        DB.InsertCommand = new SQLiteCommand("INSERT INTO Cars2 (speed, dist)  
                                 " + " VALUES (:speed,  :dist)", conread);
        DB.InsertCommand.Parameters.Add("speed", DbType.Double, 0, "speed");
        DB.InsertCommand.Parameters.Add("dist", DbType.Double, 20, "dist");
        DB.Update(DS, "NewCars");



        }
    }
}

And this works (create a new sqlite table from old one): 这工作(从旧的创建一个新的sqlite表):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            string fullPath = "C:\\Users\\data\\test.db";
            SQLiteConnection conread = new SQLiteConnection("Data Source=" + fullPath);
            conread.Open();


        SQLiteCommand cmd = new SQLiteCommand(conread);
        cmd.CommandText = "DROP TABLE IF EXISTS Cars";
        cmd.ExecuteNonQuery();
        cmd.CommandText = "CREATE TABLE Cars (speed REAL , dist REAL)";
        cmd.ExecuteNonQuery();
        cmd.CommandText = "INSERT INTO Cars SELECT * from DS";
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        }
    }
}

But this one is what I wanted (use datatable and adapter to create new table in sqlite) and is not working: 但这个是我想要的(使用datatable和adapter在sqlite中创建新表)并且不起作用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            string fullPath = "C:\\Users\\data\\test.db";
            SQLiteConnection conread = new SQLiteConnection("Data Source=" + fullPath);
            conread.Open();
    SQLiteDataAdapter DB = new SQLiteDataAdapter("SELECT speed, dist FROM Cars2", conread);
    DataSet DS = new DataSet();

    DB.Fill(DS, "NewCars");


    object[] rowVals = new object[2];
    rowVals[0] = 10;
    rowVals[1] = 20;
    DS.Tables["NewCars"].Rows.Add(rowVals);


   SQLiteDataAdapter DB2 = new SQLiteDataAdapter("SELECT speed, dist FROM Cars3", conread);
    DB2.InsertCommand = new SQLiteCommand("INSERT INTO Cars3 (speed, dist)  
                        " + " VALUES (:speed,  :dist)", conread);
    DB2.InsertCommand.Parameters.Add("speed", DbType.Double, 0, "speed");
    DB2.InsertCommand.Parameters.Add("dist", DbType.Double, 20, "dist");
    DB2.Update(DS, "NewCars");


    }
}
}

Please help!!! 请帮忙!!!

I found the answer! 我找到了答案!

Adapter.Update can only be used to update the original table in the database and not to save the datatable in a new one. Adapter.Update只能用于更新数据库中的原始表,而不能用于保存新数据表。 Please refer to the thread for answers: 请参考主题获取答案:

C# Dataset to Access DB C#数据集访问数据库

Cheers! 干杯!

The easiest way to copy one table to another database is to attach the second database to the first connection, and copy the data directly: 将一个表复制到另一个数据库的最简单方法是将第二个数据库附加到第一个连接,然后直接复制数据:

ATTACH '...\test4.s3db' AS 'test4';
DROP TABLE IF EXISTS test4.MathRec;
CREATE TABLE test4.MathRec(name text , score integer);
INSERT INTO test4.MathRec SELECT * FROM MathRec;

If you want to do calculations, you might be able to do them in SQL, in the SELECT statement. 如果要进行计算,可以在SELECT语句中使用SQL进行计算。 If not, you have to read the data with a SELECT and then execute one INSERT statement for each record to be written. 如果没有,则必须使用SELECT读取数据,然后对要写入的每条记录执行一个INSERT语句。 (In that case, you don't need the ATTACH .) (在这种情况下,您不需要ATTACH 。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM