1

これは、すべての「項目」が数値であるか、すべての項目が英数字である限り機能します。数値と英数字の「アイテム」がある場合、値が正しく入力されません。

コードは次のとおりです。

public void updateInventory()
{
    try
    {
        if (File.Exists(inventoryUpdateDirectory + "inventoryUpdate.csv"))
        {
            csvReader csv = new csvReader();
            DataTable inventory = csv.read(inventoryUpdateDirectory + "inventoryUpdate.csv");
            //int test = inventory.Rows.Count;
            string sql = "";

            foreach (DataRow inventoryItem in inventory.Rows)
            {
                try
                {
                    sql = " Update Inventory set OnHand = " + inventoryItem[1] + " WHERE Sku = '" + inventoryItem[0].ToString().Trim() + "'";
                    //executeSQL(sql);
                }
                catch { }
            }

            File.Delete(inventoryUpdateDirectory + "inventoryUpdate.csv");
        }
        else
        {
            writeToFile("fileDoesntExist", inventoryUpdateDirectory + "error.txt");
        }
    }
    catch { }
}

読み取るファイルは次のとおりです。

ALB001,0
ALB002,66
10001,0
10016,348

これはうまくいきます:

ALB001,0
ALB002,66

これはうまくいきます:

10001,0
10016,348

これは機能しません:

ALB001,0
ALB002,66
10001,0
10016,348

inventoryItem配列を空として埋めます{}

+       inventoryItem[0]    {}  object {System.DBNull}

の値を持つ必要がありますALB001

CSV の最初の「列」には文字数を含めることができるため、常に文字列として扱う必要があります。2 番目の「列」は常に数字になります。

これを理解するのを手伝ってくれる人はいますか?

SQLクエリを編集して文字列としてキャストする必要があると思いますが、よくわかりません。

CSV リーダーの編集:

namespace CSV
{
    public class csvReader
    {
        public DataTable read(string strFileName)
        {
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + "; Extended Properties = \"Text;HDR=NO;FMT=Delimited\"");
            conn.Open();
            string strQuery = "SELECT * FROM [" + System.IO.Path.GetFileName(strFileName) + "]";
            OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conn);
            DataSet ds = new DataSet("CSV File");
            adapter.Fill(ds);
            return ds.Tables[0];
        }

        public DataTable read(string strFileName, bool firstRowHeaders)
        {
            string hdr = "NO";
            if (firstRowHeaders) { hdr = "YES"; }

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + "; Extended Properties = \"Text;HDR=" + hdr + ";FMT=Delimited\"");
            conn.Open();
            string strQuery = "SELECT * FROM [" + System.IO.Path.GetFileName(strFileName) + "]";
            OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conn);
            DataSet ds = new DataSet("CSV File");
            adapter.Fill(ds);
            return ds.Tables[0];
        }
    }
}
4

4 に答える 4

1

問題は明らかに CsvReader クラスにあります。ソースコードを添付していないため、そのデータテーブルにコンテンツが入力されていない理由を知るのは難しく、私ができる最善のことは推測です.

codeproject のこの csv リーダーを使用することをお勧めします: http://www.codeproject.com/Articles/86973/C-CSV-Reader-and-Writer

単純な while ループを使用してファイル行を反復処理できるため、データ テーブルを操作する必要はありません。コードは次のようになります。

using (CsvReader reader = new CsvReader(FilePath, Encoding.Default))
{
   while (reader.ReadNextRecord())
   {
          sql = " Update Inventory set OnHand = " + reader.Fields[1] + " WHERE Sku = '" + reader.Fields[0] + "'";
   }
} 
于 2012-05-03T21:43:30.727 に答える
0

以下の例では、OnHand 値を一重引用符で囲み、SQL が常に文字列を想定する必要があることを示しています。「@Parameters」を使用して値をインラインで割り当てるように SQL ステートメントを変更することをお勧めします。

sql = " Update Inventory set OnHand = '" + inventoryItem[1] + "' WHERE Sku = '" + inventoryItem[0].ToString().Trim() + "'";
于 2012-05-03T21:36:58.073 に答える
0

LINQ で CSV を読み取ることができます

var data = (from line in File.ReadAllLines(fileName).AsParallel()
            select line.Split(',')).ToList();

次に、適切なキャスト、更新を行います。

于 2012-05-03T21:46:02.397 に答える