如何使用 C# 在 SQL 数据库 table 中的特定索引处插入一行
How to insert a row at a specific index in a SQL database table using C#
我创建了一个 SQL 数据库,名称为:DateTimes.
数据库现在已填入此图像上显示的以下信息:
如 DateTime 列中所示,我们可以看到这些 DateTime 值按升序排列:
201005011600
201005011630
201005011645
201005011700
现在问题来了,不知怎么办。正如我们所看到的,这些行是按 DateTime 升序排列的,现在我有一个新记录,其中包含我想添加到 table:
的 DateTime
201005011615
到目前为止,我的代码仅在 table.
的末尾添加了一行
我这里有 2 个问题:
我现在想将这条记录插入正确的行中,这将是数据Table中的第二行。这意味着该记录将插入 Table(DateTime 升序)
中的正确索引处
这怎么可能?
看代码,我用了:comm.Parameters.Add(new SqlParameter...
5次。我在这里想知道的是,因为我以后可以拥有数千个专栏。如果有一种更快的方法来 .Add
这里所有列的所有信息,而不是这里的某种批处理。这意味着 1 个 .Add,而不是 5 个 .Adds?
void insertvalue()
{
string connectionString = GetConnectionString();
string cmdString = "INSERT INTO DateTimes (DateTime,F1,F2,G1,G2) VALUES (@val1, @val2, @val3, @val4, @val5)";
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand comm = new SqlCommand())
{
comm.Connection = conn;
comm.CommandText = cmdString;
comm.Parameters.Add(new SqlParameter("@val1", 201005011615));
comm.Parameters.Add(new SqlParameter("@val2", 0.05044));
comm.Parameters.Add(new SqlParameter("@val3", 0.05044));
comm.Parameters.Add(new SqlParameter("@val4", 0.05044));
comm.Parameters.Add(new SqlParameter("@val5", 0.05044));
try
{
conn.Open();
int i = comm.ExecuteNonQuery();
if (i != 0) { MessageBox.Show(i + "Data Saved"); }
}
catch (SqlException ex) { MessageBox.Show(ex.ToString()); }
}
}
}
static private string GetConnectionString()
{
return "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\andre\source\repos\TestDatabaseCreation\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
}
考虑一下您将如何查询 table 中的数据。如果您总是希望按 DATE 顺序检索数据,并且 DATE 始终反映您插入行的日期和时间,那么在 DATE 列上定义一个 CLUSTERED 索引是合适的.
然后您通常总是将行添加到当前页面的末尾(然后获取磁盘上的下一个连续页面)并继续添加到该页面的末尾。您在 DATE 之前的查询将是高效的,因为它们将能够找到起始页并从那里连续扫描到您的日期范围的末尾。
注意 - SQL 服务器总是先将页面读入内存,然后再将其发送到您的客户端应用程序 - 这就是它的工作方式。没有将页面从磁盘直接流式传输到客户端应用程序的机制。但是,不要担心,因为它是一个尽可能高效的过程。
我创建了一个 SQL 数据库,名称为:DateTimes.
数据库现在已填入此图像上显示的以下信息:
如 DateTime 列中所示,我们可以看到这些 DateTime 值按升序排列:
201005011600
201005011630
201005011645
201005011700
现在问题来了,不知怎么办。正如我们所看到的,这些行是按 DateTime 升序排列的,现在我有一个新记录,其中包含我想添加到 table:
的 DateTime
201005011615
到目前为止,我的代码仅在 table.
的末尾添加了一行我这里有 2 个问题:
我现在想将这条记录插入正确的行中,这将是数据Table中的第二行。这意味着该记录将插入 Table(DateTime 升序)
中的正确索引处 这怎么可能?看代码,我用了:
comm.Parameters.Add(new SqlParameter...
5次。我在这里想知道的是,因为我以后可以拥有数千个专栏。如果有一种更快的方法来.Add
这里所有列的所有信息,而不是这里的某种批处理。这意味着 1 个 .Add,而不是 5 个 .Adds?void insertvalue() { string connectionString = GetConnectionString(); string cmdString = "INSERT INTO DateTimes (DateTime,F1,F2,G1,G2) VALUES (@val1, @val2, @val3, @val4, @val5)"; using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlCommand comm = new SqlCommand()) { comm.Connection = conn; comm.CommandText = cmdString; comm.Parameters.Add(new SqlParameter("@val1", 201005011615)); comm.Parameters.Add(new SqlParameter("@val2", 0.05044)); comm.Parameters.Add(new SqlParameter("@val3", 0.05044)); comm.Parameters.Add(new SqlParameter("@val4", 0.05044)); comm.Parameters.Add(new SqlParameter("@val5", 0.05044)); try { conn.Open(); int i = comm.ExecuteNonQuery(); if (i != 0) { MessageBox.Show(i + "Data Saved"); } } catch (SqlException ex) { MessageBox.Show(ex.ToString()); } } } } static private string GetConnectionString() { return "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\andre\source\repos\TestDatabaseCreation\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30"; }
考虑一下您将如何查询 table 中的数据。如果您总是希望按 DATE 顺序检索数据,并且 DATE 始终反映您插入行的日期和时间,那么在 DATE 列上定义一个 CLUSTERED 索引是合适的.
然后您通常总是将行添加到当前页面的末尾(然后获取磁盘上的下一个连续页面)并继续添加到该页面的末尾。您在 DATE 之前的查询将是高效的,因为它们将能够找到起始页并从那里连续扫描到您的日期范围的末尾。
注意 - SQL 服务器总是先将页面读入内存,然后再将其发送到您的客户端应用程序 - 这就是它的工作方式。没有将页面从磁盘直接流式传输到客户端应用程序的机制。但是,不要担心,因为它是一个尽可能高效的过程。