将语句插入数据表
Insert statement into a Datatable
我正在尝试 运行 将一条插入语句插入到 DataTable 中(我这样做是为了执行语句中的所有函数,以便我可以获得预期的值)
private void insertintoDT(DataTable destination, string InsertStatement)
{
SqlCommand comm = new SqlCommand(InsertStatement);
SqlDataReader reader = new SqlDataReader();
destination.Load(reader);
}
}
此 DataTable 随后将加载到 DataGrid 中,这样我就可以看到将要插入的值。我试过像这样分解插入语句:
private void breakupInsert(String insert)
{
DataTable dt = new DataTable();
dgvInsert.Rows.Clear();
string stemp = insert;
int len = stemp.Length;
int itemp = 0;
stemp = stemp.Remove(0, 12);
itemp = stemp.IndexOf("VALUES") - 1;
gvtable = stemp.Substring(0, itemp);
stemp = stemp.Remove(0, itemp + 9);
int itemcount = stemp.Count(x => x == ',') + 1;
string[] values = new string[itemcount - 1];
//populate values
int h = 0;//Used as a start index
int itemc = 0; //item index
for (int k = 0; k < stemp.Length; k++)
{
if (k == stemp.Length - 2)
{
values[itemc] = ExecuteSQL(stemp.Substring(h, (k + 1) - h));
break;
}
else
if (stemp.Substring(k, 2) == (", "))
{
itemp = stemp.IndexOf(", ");
values[itemc] = ExecuteSQL(stemp.Substring(h, k - h));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
else if (stemp.Substring(k, 2) == ("),"))
{
itemp = stemp.IndexOf("),");
values[itemc] = ExecuteSQL(stemp.Substring(h, k - h));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
else if (stemp.Substring(k, 2) == ("',"))
{
itemp = stemp.IndexOf("',");
values[itemc] = ExecuteSQL(stemp.Substring(h, (k - h) + 1));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
}
for (int j = 0; j < values.Length; j++)
{
this.dgvInsert.Rows.Insert(j, j + 1, values[j], values[j].Length);
}
}
然而,当函数在插入语句中时,这会中断(例如 cast)
有没有办法做到这一点,或者这是一个失败的原因?
澄清一下:
我实质上是在尝试为用户提供一个文本框,他们可以将 SQL 语句粘贴到其中,然后该语句将反映在数据网格中。因此,如果插入语句,数据表将反映正在插入的值。但从未将它们插入数据库。
查询是特定于数据库的,因此解析查询是由特定于数据库的组件完成的,可能在数据库服务器上,否则是该数据库的 ADO.NET 驱动程序。
您可以使用 SQLite 创建内存数据库,这样您的最终用户就不必设置单独的数据库(它确实需要 SQLite dll 与您的应用程序一起提供),但是使用这种方法会迫使您使用 SQLite 方言,如果您尝试在不同的数据库上使用某些查询,则它们可能无法正常工作。不过,这对我来说确实是最简单的出路。
This answer建议使用entity framework解析query,不知道能不能帮你更新datatable。我自己没有尝试过,但可能值得研究一下。
我正在尝试 运行 将一条插入语句插入到 DataTable 中(我这样做是为了执行语句中的所有函数,以便我可以获得预期的值)
private void insertintoDT(DataTable destination, string InsertStatement)
{
SqlCommand comm = new SqlCommand(InsertStatement);
SqlDataReader reader = new SqlDataReader();
destination.Load(reader);
}
}
此 DataTable 随后将加载到 DataGrid 中,这样我就可以看到将要插入的值。我试过像这样分解插入语句:
private void breakupInsert(String insert)
{
DataTable dt = new DataTable();
dgvInsert.Rows.Clear();
string stemp = insert;
int len = stemp.Length;
int itemp = 0;
stemp = stemp.Remove(0, 12);
itemp = stemp.IndexOf("VALUES") - 1;
gvtable = stemp.Substring(0, itemp);
stemp = stemp.Remove(0, itemp + 9);
int itemcount = stemp.Count(x => x == ',') + 1;
string[] values = new string[itemcount - 1];
//populate values
int h = 0;//Used as a start index
int itemc = 0; //item index
for (int k = 0; k < stemp.Length; k++)
{
if (k == stemp.Length - 2)
{
values[itemc] = ExecuteSQL(stemp.Substring(h, (k + 1) - h));
break;
}
else
if (stemp.Substring(k, 2) == (", "))
{
itemp = stemp.IndexOf(", ");
values[itemc] = ExecuteSQL(stemp.Substring(h, k - h));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
else if (stemp.Substring(k, 2) == ("),"))
{
itemp = stemp.IndexOf("),");
values[itemc] = ExecuteSQL(stemp.Substring(h, k - h));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
else if (stemp.Substring(k, 2) == ("',"))
{
itemp = stemp.IndexOf("',");
values[itemc] = ExecuteSQL(stemp.Substring(h, (k - h) + 1));
h = k + 2;
itemc = itemc + 1;
k = k + 1;
}
}
for (int j = 0; j < values.Length; j++)
{
this.dgvInsert.Rows.Insert(j, j + 1, values[j], values[j].Length);
}
}
然而,当函数在插入语句中时,这会中断(例如 cast)
有没有办法做到这一点,或者这是一个失败的原因?
澄清一下: 我实质上是在尝试为用户提供一个文本框,他们可以将 SQL 语句粘贴到其中,然后该语句将反映在数据网格中。因此,如果插入语句,数据表将反映正在插入的值。但从未将它们插入数据库。
查询是特定于数据库的,因此解析查询是由特定于数据库的组件完成的,可能在数据库服务器上,否则是该数据库的 ADO.NET 驱动程序。
您可以使用 SQLite 创建内存数据库,这样您的最终用户就不必设置单独的数据库(它确实需要 SQLite dll 与您的应用程序一起提供),但是使用这种方法会迫使您使用 SQLite 方言,如果您尝试在不同的数据库上使用某些查询,则它们可能无法正常工作。不过,这对我来说确实是最简单的出路。
This answer建议使用entity framework解析query,不知道能不能帮你更新datatable。我自己没有尝试过,但可能值得研究一下。