1
public partial class Form1 : Form
{

    public SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Alexander\Desktop\Archivos.mdf;Integrated Security=True;Connect Timeout=30");



    private void Readbtn_Click(object sender, EventArgs e)
    {
         con.Open();
         Propiedades prop = new Propiedades();
         List<string> myValues = new List<string>();

         string line;

       StreamReader file = new StreamReader(@"c:\temp\archivo.txt");
        if ((line = file.ReadLine()) != null)
        {
            string[] fields = line.Split(',');
            prop.matricula = fields[0].ToString();
            prop.nombre = fields[1].ToString();
            prop.sueldo = decimal.Parse(fields[2]); 

            for (int i = 0; i < fields.Length; i++)
            {
                listBox1.Items.Add(fields[i]);
            }

        }



     SqlCommand cmd = new SqlCommand("INSERT INTO Archivos(Codigo, Nombre, Sueldo) VALUES (@Matricula, @Nombre, @Sueldo", con);
     cmd.Parameters.AddWithValue("@Matricula", prop.matricula);
     cmd.Parameters.AddWithValue("@Nombre", prop.nombre);
     cmd.Parameters.AddWithValue("@Sueldo", prop.sueldo);
     cmd.ExecuteNonQuery();

     con.Close();


 }

こんにちは、このコードの変更について少しだけ助けが必要です。テキストファイルの最初の行を保存するために既にこれを持っていますが、他の行を読み取る方法については考えていません。また、SQL テーブルに既にその情報が含まれている場合、ファイルが既に存在することをユーザーに知らせる例外またはメッセージ ボックスが起動されることを検証したいと思います。助けてください

4

3 に答える 3

0

最初に飛び出す必要があることがいくつかありますが、最初の if ステートメントの代わりに while ループを使用したいということです。

    while ((line = file.ReadLine()) != null)
    {
        string[] fields = line.Split(',');
        prop.matricula = fields[0].ToString();
        prop.nombre = fields[1].ToString();
        prop.sueldo = decimal.Parse(fields[2]); 

        for (int i = 0; i < fields.Length; i++)
        {
            listBox1.Items.Add(fields[i]);
        }

    }

また、リスト ボックスにアイテムを表示する方法によっては、内部の for ループの代わりに使用することもできます。

listBox1.Items.Add(prop.matricula+','+prop.nombre+',prop.sueldo.toString());
于 2013-11-07T04:32:31.793 に答える
0

まず、コードに LINQ を使用することを検討してください。わずかにオーバーヘッドが増えることをあまり気にしないのであれば、LINQ を使用すると作業がずっと楽になります。自動的に情報をキャッシュし、多くのことをより効率的に行うことができます。また、コードが理解しやすい場合があることは言うまでもありません。そのためには、Visual Studio でデータベースの ado.net モデルを作成する必要がありますが、それほど時間はかかりません。正確な方法は、私が思うに、

File -> Add Item -> Add new Item

またはそのようなもので、ado.net エンティティを検索します。次に、要求される詳細を入力するだけです。次に、このエンティティを使用して (方法がわからない場合は、必要に応じて修正できるように返信してください)、指定した方法でデータを追加できます。

さて、コードが機能しない理由は、コードの問題です。区切り記号の使用が問題になる可能性があると思います。次の修正コードが役立つ場合があります。

StreamReader file = new StreamReader(@"c:\temp\archivo.txt");

    while(file.Read()){

    //YOUR CODE FOR CONCATENATING DATA HERE
}

その理由は、リーダーが False または Null の戻り値を持つまで読み取るためです。何らかの理由でコードが最初の行の後に残っているようで、これで解決する場合があります。

于 2013-11-07T04:35:02.840 に答える
0

ファイルを 1 行ずつ読み取り、値をDataTableに追加してから、 SQL Bulk Insertを使用してデータベースに格納することをお勧めします。

それは次のようなものになります

int batchSize = 10000;

SqlBulkCopy bc = new SqlBulkCopy(con);

DataTable dtArchivos = new DataTable();
dtArchivos.Columns.AddRange(new []
{
    new DataColumn("Codigo", typeof(string)), 
    new DataColumn("Nombre", typeof(string)), 
    new DataColumn("Sueldo", typeof(decimal)), 
});
StreamReader file = new StreamReader(@"c:\temp\archivo.txt");
string line = file.ReadLine();
while (line != null)
{
    string[] fields = line.Split(',');
    DataRow dr = dtArchivos.NewRow();
    dr["Codigo"] = fields[0].ToString();
    dr["Nombre"] = fields[1].ToString();
    dr["Sueldo"] = decimal.Parse(fields[2]);
    dtArchivos.Rows.Add(dr);

    if (dtArchivos.Rows.Count == batchSize)
    {
        bc.WriteToServer(dtArchivos);
        dtArchivos.Clear();
    }
    line = file.ReadLine();
}
bc.WriteToServer(dtArchivos);

ファイルが大きいと、DataTable のサイズが原因でアプリケーションのメモリが不足する可能性があるため、バッチ処理を行うためのロジックを追加しました。

于 2013-11-07T04:26:09.350 に答える