2009-11-24 2 views
0

Вот код:Сравнить набор данных колонного типа

try 
     { 
      string strReadDataLine; 
      strReadDataLine = sr.ReadLine(); 

      while (strReadDataLine != null) 
      { 
       string[] strReadDataLineSplited = strReadDataLine.Split(';'); 

       DataRow thisRow = thisDataSet.Tables["Repartition"].NewRow(); 
       DataTable item = thisDataSet.Tables["Repartition"]; 
       for (int i = 0; i < strDataLines.Length; i++) 
       { 
        DataColumn thisColomn = 
           thisDataSet.Tables["Repartition"].Columns[i]; 
        // Here i need to know if the colomn is a string 
        if (thisColomn.DataType.ToString() == "System.String") 
        { 
         thisRow[strDataLines[i]] = strReadDataLineSplited[i]; 
        } 
       } 
       thisRow["ID_USAGER"] = 1; 

       thisDataSet.Tables["Repartition"].Rows.Add(thisRow); 

       strReadDataLine = sr.ReadLine(); 
      } 
      //thisDataAdapter.Update(thisDataSet, "Repartition"); 

     } 

Что мне нужно знать, если столбец является строкой, чтобы присвоить данные в виде строки в столбце. То, что я получаю, является аргументомException, говорящим, что «входная строка не была в правильном формате. Не удалось сохранить < 2.111> в MY_FLOAT colomn. Тип ожидания двойной».

Что мне действительно нужно, это сравнить тип столбца с чем-то, чтобы получить тип, а затем назначить столбцу правильному типу.

Надеюсь, это ясно, поскольку мой английский не так хорош.

+0

thisRow [strDataLines [я]] выглядит, как вы не хранения данных, где вы думаете, –

+0

Вы можете оставить структуру таблицы и некоторые данные? –

ответ

0

Если я правильно понял, я создал функциональную копию фрагмента кода и исправил ее, чтобы правильно обрабатывать преобразование типов. Вы действительно пропустили две вещи:

. # 1 - Вы индексировали столбцы по порядку и использовали эту информацию для получения типа столбца. Затем, установив информацию, вы проиндексировали столбец мое имя. Я исправил это с введением переменной «columnName» ниже.

. # 2 - Чтобы правильно преобразовать ввод строки в нужный тип столбца, вам нужно использовать метод System.Convert.ChangeType (object, Type), как показано ниже.

static void Main() 
    { 
     DataSet ds = new DataSet(); 
     DataTable dt = ds.Tables.Add("Repartition"); 
     DataColumn col; 

     col = dt.Columns.Add("ID_USAGER", typeof(int)); 
     col = dt.Columns.Add("TestString", typeof(string)); 
     col = dt.Columns.Add("TestInt", typeof(int)); 
     col = dt.Columns.Add("TestDouble", typeof(double)); 

     string testData = "TestString;TestInt;TestDouble"; 
     testData += Environment.NewLine + "Test1;1;1.1"; 
     testData += Environment.NewLine + "Test2;2;2.2"; 

     Test(ds, new StringReader(testData)); 
    } 

    public static void Test(DataSet thisDataSet, StringReader sr) 
    { 
     string[] strDataLines = sr.ReadLine().Split(';'); 
     string strReadDataLine; 
     strReadDataLine = sr.ReadLine(); 

     while (strReadDataLine != null) 
     { 
      string[] strReadDataLineSplited = strReadDataLine.Split(';'); 

      DataRow thisRow = thisDataSet.Tables["Repartition"].NewRow(); 
      DataTable item = thisDataSet.Tables["Repartition"]; 
      for (int i = 0; i < strDataLines.Length; i++) 
      { 
       string columnName = strDataLines[i]; 
       //#1 Don't use this as Columns[i] may not be Columns[columnName] 
       //DataColumn thisColomn = thisDataSet.Tables["Repartition"].Columns[i]; 
       DataColumn thisColomn = thisDataSet.Tables["Repartition"].Columns[columnName]; 
       //#2 Assing to the results of the string converted to the correct type: 
       thisRow[strDataLines[i]] = System.Convert.ChangeType(strReadDataLineSplited[i], thisColomn.DataType); 
      } 
      thisRow["ID_USAGER"] = 1; 

      thisDataSet.Tables["Repartition"].Rows.Add(thisRow); 

      strReadDataLine = sr.ReadLine(); 
     } 
    } 
Смежные вопросы