2010-02-03 4 views
2

Я использую VB.NET и SQL Server 2005, и я хочу написать текстовый файл из базы данных.Написание текстового файла

Открыть текстовый файл, прочитать данные из базы данных, затем записать в текстовый файл.

Код.

cmd = New SqlCommand("SELECT ID, Name, Dept from table", con) 
dr = cmd.ExecuteReader 

While dr.Read() 

    Dim data As String 
    data = File.ReadAllText(dr.Item("PersonID")) 
    File.WriteAllText("D:\test.txt", data) 
End While 

Приведенный выше код показывает ошибку, как написать текстовый файл

VB.NET код Помощь

+0

Ну, что за ошибка? – UpTheCreek

+0

@Sosh ReadAllText берет Путь, а не данные! он читает путь к файлу ... даже если PersonID является чем-то вроде C: \ myfile.txt, файл в D: будет содержать только последний прочитанный файл, поскольку WriteAllText перезаписывает его (создавая всегда новый файл)! и разве вы не видите здесь огромное количество времени? – balexandre

+0

@balexandre - Я не тот, кто просит ответа. Также не уверен, что я понимаю ваш момент времени. Я хочу сказать, что если вы зададите вопрос о проблеме, которая включает в себя ошибку, ** вы должны, конечно, также отправить сообщение об ошибке. ** – UpTheCreek

ответ

6

В своем коде вы на самом деле не чтение из базы данных. Попробуйте следующее:

Using writer = New StreamWriter("d:\test.txt") 
    While dr.Read() 
     Dim id = dr.GetInt32(0) 
     Dim name = dr.GetString(1) 
     Dim dept = dr.GetString(2) 

     writer.WriteLine(String.Format("{0} {1} {2}", id, name, dept)) 
    End While 
End Using 
+0

, если вы используете TimeSpan для просмотра как долго работает StreamWrite, File.WriteAllLines работает быстрее, чем StreamWriter! – balexandre

+0

У меня есть 20 строк, которые читают файл, получают его размер содержимого и снова записывают файл с размером, и с использованием StreamRead и StreamWriter потребовалось около 28 мс, а File.ReadAllLines и File.WriteAllLines теперь занимают 3 мс !! – balexandre

+0

@balexandre Что делать, если SQL-запрос возвращает миллионы записей? Вы собираетесь загрузить их все в память? –

0

File.ReadAllText если для чтения из файла.

File.WriteAllText напишет все в файл, перезаписав то, что в нем.

Вам необходимо получить данные, как это:

data = dr.Item("PersonID").ToString() 

При написании, вы, вероятно, хотите append the text к нему:

File.AppendAllText("D:\test.txt", data); 

Что бы быть немного более эффективным было бы перебрать вас данные, создавая весь набор данных в памяти (добавляя разрывы строк в конце каждой строки), а затем записывая все за один раз с File.WriteAllText. Я предполагаю, что количество данных не является массивным, так как этот подход будет использовать больше памяти, но будет приводить к меньшему количеству дискового ввода-вывода.

1
cmd = New SqlCommand("SELECT ID, Name, Dept from table", con) 
dr = cmd.ExecuteReader 

Dim sb as new StringBuilder 

While dr.Read() 

    ''Let's read line by line and Append it to our StringBuilder 
    sb.AppendLine(
      String.Format("{0} | {1} | {2} | {3}", 
        dr.item("ID"), dr.item("Name"), dr.item("Dept"))) 

End While 

''Now that we have all data in our StringBuilder, lets put into our file 

File.WriteAllLines("D:\test.txt", sb.ToString()) 

P.S. от C# парне ... пожалуйста, проверьте, если код правильно :) (C# код ниже)

using (SqlConnection con = new SqlConnection("my Connection String")) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = con; 
     cmd.CommandType = System.Data.CommandType.Text; 
     cmd.CommandText = "SELECT ID, Name, Dept from table"; 

     con.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     StringBuilder sb = new StringBuilder(); 

     while (dr.Read()) 
      // Let's read line by line and Append it to our StringBuilder 
      sb.AppendLine(
       String.Format("{0} | {1} | {2} | {3}", 
        dr["ID"], dr["Name"], dr["Dept"])); 

     // Now that we have all data in our StringBuilder, lets put into our file 
     File.WriteAllLines("D:\test.txt", sb.ToString()); 
    } 
} 
+0

@Balexandre, было показано сообщение об ошибке в sb.ToString – Gopal

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