2011-12-08 8 views
1

VS2005 C#ASP.NETとSQL Server 2005を使用しています。インポートする前にファイルの内容を確認する

Excelデータをインポートする機能があります。私は、内部のデータが不適切な状況に遭遇したとき、SQL Server DBを停止させます。

など。 SELECT [Username]、[Password] from [userlist $] - > Excelスプレッドシートに[Username]より大きい値が列またはその列の下に含まれていると、サーバーがクラッシュします。

E.G. enter image description here

アップロードする前にこのファイルのエラーを確認するにはどうすればよいですか?確認のためifelseのステートメントを推奨します。

ご協力いただきありがとうございます。以下は

は、Excelのアップロードのための私のコードスニペットです:

if (FileImport.HasFile) 
    { 

     // Get the name of the Excel spreadsheet to upload. 
     string strFileName = Server.HtmlEncode(FileImport.FileName); 

     // Get the extension of the Excel spreadsheet. 
     string strExtension = Path.GetExtension(strFileName); 

     // Validate the file extension. 
     if (strExtension == ".xls" || strExtension == ".xlsx") 
     { 
       // Generate the file name to save. 
       string strUploadFileName = "C:/Documents and Settings/user01/My Documents/Visual Studio 2005/WebSites/MajorProject/UploadFiles/" + DateTime.Now.ToString("yyyyMMddHHmmss") + strExtension; 

       // Save the Excel spreadsheet on server. 
       FileImport.SaveAs(strUploadFileName); 

       // Create Connection to Excel Workbook 
       string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strUploadFileName + ";Extended Properties=Excel 8.0;"; 

       using (OleDbConnection connection = 
          new OleDbConnection(connStr)) 
       { 
        string selectStmt = string.Format("Select [COLUMNS] FROM [userlist$]"); 

        OleDbCommand command = new OleDbCommand(selectStmt, connection); 

        connection.Open(); 
        Console.WriteLine("Connection Opened"); 
        // Create DbDataReader to Data Worksheet 
        using (DbDataReader dr = command.ExecuteReader()) 
        { 
         // SQL Server Connection String 
         string sqlConnectionString = "Data Source=<datasource>"; 

         // Bulk Copy to SQL Server 
         using (SqlBulkCopy bulkCopy = 
            new SqlBulkCopy(sqlConnectionString)) 
         { 
          bulkCopy.DestinationTableName = "UserDB"; 
          bulkCopy.WriteToServer(dr); 
          return; 
         } 
        } 
       } 
+0

データベースサーバー全体がクラッシュしていると言っていますか? –

+0

@ LasseV.Karlsenはい、 'リモートホストがリモートホストによって強制的にクローズされたため、サーバーを再起動して再度接続する必要があります。 – user1084683

答えて

-1

データベースをクラッシュさせる理由はありません。可変長が正しく宣言されていることを確認してください。

+0

これは有効な答えではありません。どのような可変長が正しく宣言されるはずですか?これは元の質問とは関係ありません。 –

0

Excelのスプレッドシートにあるデータの量によっては、あなたがにに興味がある列の値のそれぞれを読むことができますたとえば、最初の競合が見つかるとすぐにインポートに失敗します。既存のdatareeaderを使用して例えば

は、:

Dictionary<string, string> cValues = new Dictionary<string, string>(); 

// Create DbDataReader to Data Worksheet 
using (DbDataReader dr = command.ExecuteReader()) 
{ 
    while (dr.Read()) { 
     string sValue = dr[0].ToString(); 
     if (cValue.ContainsKey(sValue)) { 
     // There is a duplicate value, so bail 
     throw new Exception("Duplicate value " + sValue); 
     } else { 
     cValues.Add(sValue, sValue); 
     } 
    } 
} 

// Now execute the reader on the command again to perform the upload 
using (DbDataReader dr = command.ExecuteReader()) 
0

データベースで、問題の原因を解決する必要があります。どうやら、データを格納する方法は、誤って入力されたデータを処理するストアドプロシージャを使用する必要があります。

また、データベーステーブルの制約により、非センシティブデータを格納することを禁止する必要があります。

関連する問題