暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQLite INSERT 数据操作指南:使用 C#

技术老小子 2024-10-08
0

本文将详细介绍如何使用 C# 在 SQLite 数据库中执行 INSERT 操作。INSERT 操作是数据库管理中最基本和常用的操作之一,用于向表中添加新的数据记录。

准备工作

首先,确保你的项目中已安装 System.Data.SQLite
NuGet 包。在你的 C# 文件顶部添加以下 using 语句:

    using System;
    using System.Data.SQLite;

    连接到数据库

    在执行任何数据库操作之前,我们需要建立与数据库的连接。以下是一个建立连接的辅助方法:

      public static SQLiteConnection ConnectToDatabase(string dbPath)
      {
      try
      {
      SQLiteConnection connection = new SQLiteConnection($"Data Source={dbPath};Version=3;");
      connection.Open();
      return connection;
      }
      catch (Exception ex)
      {
      Console.WriteLine($"连接数据库时出错:{ex.Message}");
      return null;
      }
      }

      创建表


        public static void CreateTable(SQLiteConnection connection, string tableName, string[] columns)
        {
        try
        {
        string columnsDefinition = string.Join(", ", columns);
        string sql = $"CREATE TABLE IF NOT EXISTS {tableName} ({columnsDefinition})";


        using (SQLiteCommand command = new SQLiteCommand(sql, connection))
        {
        command.ExecuteNonQuery();
        }
        Console.WriteLine($"表 {tableName} 创建成功。");
        }
        catch (Exception ex)
        {
        Console.WriteLine($"创建表时出错:{ex.Message}");
        }
        }




        string[] columns = {
        "ID INTEGER PRIMARY KEY AUTOINCREMENT",
        "Name TEXT NOT NULL",
        "Age INTEGER",
        "Email TEXT"
        };
        CreateTable(connection, "Users", columns);


        基本的 INSERT 操作

        插入单条记录

        以下是一个基本的插入单条记录的方法:

          public static void InsertRecord(SQLiteConnection connection, string tableName, Dictionary<string, object> data)
          {
          try
          {
          string columns = string.Join(", ", data.Keys);
          string values = string.Join(", ", data.Keys.Select(k => "@" + k));
          string sql = $"INSERT INTO {tableName} ({columns}) VALUES ({values})";


          using (SQLiteCommand command = new SQLiteCommand(sql, connection))
          {
          foreach (var item in data)
          {
          command.Parameters.AddWithValue("@" + item.Key, item.Value);
          }
          int rowsAffected = command.ExecuteNonQuery();
          Console.WriteLine($"成功插入 {rowsAffected} 条记录。");
          }
          }
          catch (Exception ex)
          {
          Console.WriteLine($"插入记录时出错:{ex.Message}");
          }
          }

          使用示例:


            var data = new Dictionary<string, object>
            {
            { "Name", "John Doe" },
            { "Age", 30 },
            { "Email", "john@example.com" }
            };
            InsertRecord(connection, "Users", data);




            插入多条记录

            对于需要插入多条记录的情况,我们可以使用事务来提高性能:

              public static void InsertMultipleRecords(SQLiteConnection connection, string tableName, List<Dictionary<string, object>> dataList)
              {
              try
              {
              using (SQLiteTransaction transaction = connection.BeginTransaction())
              {
              foreach (var data in dataList)
              {
              string columns = string.Join(", ", data.Keys);
              string values = string.Join(", ", data.Keys.Select(k => "@" + k));
              string sql = $"INSERT INTO {tableName} ({columns}) VALUES ({values})";


              using (SQLiteCommand command = new SQLiteCommand(sql, connection, transaction))
              {
              foreach (var item in data)
              {
              command.Parameters.AddWithValue("@" + item.Key, item.Value);
              }
              command.ExecuteNonQuery();
              }
              }
              transaction.Commit();
              Console.WriteLine($"成功插入 {dataList.Count} 条记录。");
              }
              }
              catch (Exception ex)
              {
              Console.WriteLine($"插入多条记录时出错:{ex.Message}");
              }
              }

              使用示例:

                var dataList = new List<Dictionary<string, object>>
                {
                new Dictionary<string, object> { { "Name", "Alice" }, { "Age", 25 }, { "Email", "alice@example.com" } },
                new Dictionary<string, object> { { "Name", "Bob" }, { "Age", 35 }, { "Email", "bob@example.com" } },
                new Dictionary<string, object> { { "Name", "Charlie" }, { "Age", 40 }, { "Email", "charlie@example.com" } }
                };
                InsertMultipleRecords(connection, "Users", dataList);

                插入并获取自增 ID

                如果你的表有一个自增的主键,你可能想在插入后获取这个 ID。以下是一个实现这个功能的方法:

                  public static long InsertRecordAndGetId(SQLiteConnection connection, string tableName, Dictionary<string, object> data)
                  {
                  try
                  {
                  string columns = string.Join(", ", data.Keys);
                  string values = string.Join(", ", data.Keys.Select(k => "@" + k));
                  string sql = $"INSERT INTO {tableName} ({columns}) VALUES ({values}); SELECT last_insert_rowid();";


                  using (SQLiteCommand command = new SQLiteCommand(sql, connection))
                  {
                  foreach (var item in data)
                  {
                  command.Parameters.AddWithValue("@" + item.Key, item.Value);
                  }
                  long newId = (long)command.ExecuteScalar();
                  Console.WriteLine($"成功插入记录,新 ID 为:{newId}");
                  return newId;
                  }
                  }
                  catch (Exception ex)
                  {
                  Console.WriteLine($"插入记录并获取 ID 时出错:{ex.Message}");
                  return -1;
                  }
                  }

                  使用示例:


                    var data = new Dictionary<string, object>
                    {
                    { "Name", "David" },
                    { "Age", 28 },
                    { "Email", "david@example.com" }
                    };
                    long newId = InsertRecordAndGetId(connection, "Users", data);




                    使用参数化查询

                    注意,在上述所有方法中,我们都使用了参数化查询。这是一个很好的做法,因为:

                    1. 它可以防止 SQL 注入攻击。

                    2. 它可以提高性能,特别是在重复执行类似查询时。

                    3. 它可以正确处理不同类型的数据,包括日期和二进制数据。


                    完整示例

                    以下是一个完整的示例,展示了如何使用上述所有方法:

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


                      class Program
                      {
                      static void Main(string[] args)
                      {
                      string dbPath = "C:\\example.db";
                      SQLiteConnection connection = ConnectToDatabase(dbPath);


                      if (connection != null)
                      {
                      // 插入单条记录
                      var singleData = new Dictionary<string, object>
                      {
                      { "Name", "John Doe" },
                      { "Age", 30 },
                      { "Email", "john@example.com" }
                      };
                      InsertRecord(connection, "Users", singleData);


                      // 插入多条记录
                      var multipleData = new List<Dictionary<string, object>>
                      {
                      new Dictionary<string, object> { { "Name", "Alice" }, { "Age", 25 }, { "Email", "alice@example.com" } },
                      new Dictionary<string, object> { { "Name", "Bob" }, { "Age", 35 }, { "Email", "bob@example.com" } }
                      };
                      InsertMultipleRecords(connection, "Users", multipleData);


                      // 插入并获取自增 ID
                      var dataForId = new Dictionary<string, object>
                      {
                      { "Name", "David" },
                      { "Age", 28 },
                      { "Email", "david@example.com" }
                      };
                      long newId = InsertRecordAndGetId(connection, "Users", dataForId);


                      // 关闭连接
                      connection.Close();
                      }
                      }


                      // 在这里实现 ConnectToDatabase, InsertRecord, InsertMultipleRecords, 和 InsertRecordAndGetId 方法
                      }

                      注意事项

                      1. 始终使用参数化查询来防止 SQL 注入攻击。

                      2. 对于大量数据的插入,使用事务可以显著提高性能。

                      3. 正确处理异常,确保在出错时能够回滚事务或采取适当的错误处理措施。

                      4. 在完成操作后,记得关闭数据库连接。

                      5. 对于频繁执行的插入操作,可以考虑使用预处理语句(prepared statements)来进一步提高性能。


                      结论

                      本文详细介绍了如何使用 C# 在 SQLite 数据库中执行 INSERT 操作,包括插入单条记录、插入多条记录以及插入并获取自增 ID。这些操作是数据库编程的基础,掌握它们将帮助你更有效地管理和操作数据。


                      如果你从事上位机,自动化,机器视觉,IOT项目,数字化项目,欢迎加我微信,大家可以一起讨论学习,如果遇到技术问题可以提出来,我会尽量帮你解决问题,但不能保证喔,毕竟个人水平有限!



                      文章转载自技术老小子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论