2010-05-31 37 views
8

以下是我的簡單解析應用程序的代碼。我收到一個錯誤,指出'從System.Text.RegularExpressions.Match類型到已知的託管提供程序本機類型不存在映射'。當我從使用Split('_')切換到RegEx.Match來定義RNumberE,RNumberD等時,開始發生這種情況。任何指導都是值得讚賞的。錯誤:對象類型不存在映射

using System; 
using System.Data; 
using System.Data.SQLite; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Threading; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data.SqlClient; 


namespace CMMDataParser 
{ 
    internal class Program 
    { 


     public static List<string> GetImportedFileList() 
     { 
      List<string> ImportedFiles = new List<string>(); 
      using (SqlConnection connect = new SqlConnection(@"Server=SERVER;Database=RX_CMMData;Integrated Security=YES")) 
      { 
       connect.Open(); 
       using (SqlCommand fmd = connect.CreateCommand()) 
       { 

        fmd.CommandText = @"SELECT FileName FROM CMMData;"; 
        fmd.CommandType = CommandType.Text; 
        SqlDataReader r = fmd.ExecuteReader(); 
        while (r.Read()) 
        { 
         ImportedFiles.Add(Convert.ToString(r["FileName"])); 

        } 
       } 
      } 
      return ImportedFiles; 
     } 




     private static void Main(string[] args) 
     { 


      Console.Title = "John Deere CMM Data Parser"; 
      Console.WriteLine("Preparing CMM Data Parser... done"); 
      Console.WriteLine("Scanning for new CMM data..."); 
      Console.ForegroundColor = ConsoleColor.Gray; 

      using (SqlConnection con = new SqlConnection(@"Server=FRXSQLDEV;Database=RX_CMMData;Integrated Security=YES")) 
      { 


       con.Open(); 

       using (SqlCommand insertCommand = con.CreateCommand()) 
       { 
        Console.WriteLine("Connecting to SQL server..."); 
        SqlCommand cmdd = con.CreateCommand(); 
        string[] files = Directory.GetFiles(@"C:\Documents and Settings\js91162\Desktop\CMM WENZEL\", "*_*_*.txt", SearchOption.AllDirectories); 
        List<string> ImportedFiles = GetImportedFileList(); 
        insertCommand.Parameters.Add(new SqlParameter("@FeatType", DbType.String)); 
        insertCommand.Parameters.Add(new SqlParameter("@FeatName", DbType.String)); 
        insertCommand.Parameters.Add(new SqlParameter("@Axis", DbType.String)); 
        insertCommand.Parameters.Add(new SqlParameter("@Actual", DbType.Decimal)); 
        insertCommand.Parameters.Add(new SqlParameter("@Nominal", DbType.Decimal)); 
        insertCommand.Parameters.Add(new SqlParameter("@Dev", DbType.Decimal)); 
        insertCommand.Parameters.Add(new SqlParameter("@TolMin", DbType.Decimal)); 
        insertCommand.Parameters.Add(new SqlParameter("@TolPlus", DbType.Decimal)); 
        insertCommand.Parameters.Add(new SqlParameter("@OutOfTol", DbType.Decimal)); 

        foreach (string file in files.Except(ImportedFiles)) 

        { 
         var FileNameExt1 = Path.GetFileName(file); 
         cmdd.Parameters.Clear(); 
         cmdd.Parameters.Add(new SqlParameter("@FileExt", FileNameExt1)); 
         cmdd.CommandText = 
          @" 
        IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'RX_CMMData' AND TABLE_NAME = 'CMMData')) BEGIN SELECT COUNT(*) FROM CMMData WHERE FileName = @FileExt; END"; 



         int count = Convert.ToInt32(cmdd.ExecuteScalar()); 
         con.Close(); 
         con.Open(); 

         if (count == 0) 
         { 




           Console.WriteLine("Preparing to parse CMM data for SQL import..."); 
           if (file.Count(c => c == '_') > 5) continue; 

           insertCommand.CommandText = 
            @" 
        INSERT INTO CMMData (FeatType, FeatName, Axis, Actual, Nominal, Dev, TolMin, TolPlus, OutOfTol, PartNumber, CMMNumber, Date, FileName) 
        VALUES  (@FeatType, @FeatName, @Axis, @Actual, @Nominal, @Dev, @TolMin, @TolPlus, @OutOfTol, @PartNumber, @CMMNumber, @Date, @FileName);"; 




           string FileNameExt = Path.GetFullPath(file); 


           string RNumber = Path.GetFileNameWithoutExtension(file); 
           int index2 = RNumber.IndexOf("~"); 
           Match RNumberE = Regex.Match(RNumber, @"^(R|L)\d{6}(COMP|CRIT|TEST|SU[1-9])(?=_)", RegexOptions.IgnoreCase); 

           Match RNumberD = Regex.Match(RNumber, @"(?<=_)\d{3}[A-Z]\d{4}|\d{3}[A-Z]\d\w\w\d(?=_)", RegexOptions.IgnoreCase); 

           Match RNumberDate = Regex.Match(RNumber, @"(?<=_)\d{8}(?=_)", RegexOptions.IgnoreCase); 

           if (RNumberD.Value == @"") continue; 
           if (RNumberE.Value == @"") continue; 
           if (RNumberDate.Value == @"") continue; 
           if (index2 != -1) continue; 


          /* string RNumberE = RNumber.Split('_')[0]; 

           string RNumberD = RNumber.Split('_')[1]; 
           string RNumberDate = RNumber.Split('_')[2]; */ 

           DateTime dateTime = DateTime.ParseExact(RNumberDate.Value, "yyyyMMdd", Thread.CurrentThread.CurrentCulture); 
           string cmmDate = dateTime.ToString("dd-MMM-yyyy"); 


           string[] lines = File.ReadAllLines(file); 
           bool parse = false; 

           foreach (string tmpLine in lines) 
           { 


            string line = tmpLine.Trim(); 
            if (!parse && line.StartsWith("Feat. Type,")) 
            { 
             parse = true; 
             continue; 
            } 
            if (!parse || string.IsNullOrEmpty(line)) 
            { 
             continue; 
            } 

            Console.WriteLine(tmpLine); 
            foreach (SqlParameter parameter in insertCommand.Parameters) 
            { 
             parameter.Value = null; 
            } 

            string[] values = line.Split(new[] { ',' }); 

            for (int i = 0; i < values.Length - 1; i++) 
            { 
             SqlParameter param = insertCommand.Parameters[i]; 
             if (param.DbType == DbType.Decimal) 
             { 
              decimal value; 
              param.Value = decimal.TryParse(values[i], out value) ? value : 0; 
             } 
             else 
             { 
              param.Value = values[i]; 
             } 
            } 


            insertCommand.Parameters.Add(new SqlParameter("@PartNumber", RNumberE)); 
            insertCommand.Parameters.Add(new SqlParameter("@CMMNumber", RNumberD)); 
            insertCommand.Parameters.Add(new SqlParameter("@Date", cmmDate)); 
            insertCommand.Parameters.Add(new SqlParameter("@FileName", FileNameExt)); 
            insertCommand.ExecuteNonQuery(); 

             insertCommand.Parameters.RemoveAt("@PartNumber"); 
            insertCommand.Parameters.RemoveAt("@CMMNumber"); 
            insertCommand.Parameters.RemoveAt("@Date"); 
            insertCommand.Parameters.RemoveAt("@FileName"); 

           } 


          } 

           } 
         Console.WriteLine("CMM data successfully imported to SQL database..."); 

        } 
        con.Close(); 

      } 
     } 
    } 
} 

回答

11

在原代碼,RNumberD等都是string - 大多數代碼(SqlParameter是最有可能的)可以處理這個問題。在修改後的代碼中,它是一個正則表達式Match,它是一個表示匹配完整狀態的複雜對象,而不是只是匹配的字符串。我希望你只需要在適當位置使用RNumberD.Value(匹配文本的string)只是RNumberD將其當作爲(SQL)參數:

insertCommand.Parameters.Add(new SqlParameter("@CMMNumber", RNumberD.Value)); 

(ETC)

+0

感謝您的幫助! – 2010-06-01 13:43:38