2015-01-09 3 views
0

Я пытаюсь запустить оператор вставки в 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); 
     } 

    } 

Однако это нарушает, когда функция в операторе вставки (литая, например)

Есть ли способ сделать это, или это проигранное дело ?

уточнить: Я по существу пытается предоставить пользователю текстовое поле, которое они могут вставить оператор SQL в это утверждение будет отражаться в сетке. Поэтому, если вставляется оператор insert, то datatable будет отображать значения, которые вставляются. Но без добавления их в базу данных.

+0

было бы лучше вставить одну строку за раз –

+2

Также я не вижу, чтобы вы открывали и закрывали соединение с сервером. И вы можете использовать sqlcommand.parameters –

+0

Я все еще строю процедуру для импорта в datatable, я хотел посмотреть, возможно ли это, даже не делая вызов в базу данных. – Darkestlyrics

ответ

1

Запросы зависят от базы данных, поэтому запросы на разбор выполняются компонентом, специфичным для базы данных, возможно, на сервере базы данных, и в противном случае это драйвер ADO.NET для этой базы данных.

Вы можете использовать SQLite для создания базы данных в памяти, поэтому вашим конечным пользователям не нужно будет настраивать отдельную базу данных (для нее требуется SQLLite dll, поставляемая с вашим приложением), однако использование этого подхода заставляет вас использовать диалоги SQLite и некоторые запросы могут не работать, если вы попытаетесь использовать их в другой базе данных. Мне кажется, что это самый простой выход.

This answer предлагает использовать структуру сущности для разбора запросов, но я не знаю, может ли она помочь вам обновить данные. Я не пробовал это сам, но, возможно, стоит посмотреть.

+0

Спасибо за ответ, я пошел о преобразовании заданного запроса в linq с помощью [Linqer] (http://www.sqltolinq.com/) Однако это обойдется мне в стоимость. Другой способ, который упоминался, состоял в том, чтобы сам сам создать парсер. – Darkestlyrics

Смежные вопросы