2010-05-31 60 views
8

Đây là mã cho ứng dụng phân tích cú pháp đơn giản của tôi. Tôi nhận được một lỗi mà tiểu bang 'Không có bản đồ tồn tại từ loại System.Text.RegularExpressions.Match đến một loại bản xứ được cung cấp quản lý được biết đến'. Điều này bắt đầu xảy ra khi tôi chuyển từ sử dụng Split ('_') sang RegEx.Match để định nghĩa RNumberE, RNumberD, v.v. Bất kỳ hướng dẫn nào được đánh giá cao.Lỗi: Không có ánh xạ nào tồn tại từ loại đối tượng

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(); 

      } 
     } 
    } 
} 

Trả lời

11

Trong đoạn mã gốc, RNumberD vv là string - hầu hết các mã (SqlParameter là rất có thể) có thể xử lý này. Trong mã sửa đổi, nó là một regex Match, là một đối tượng phức tạp đại diện cho trạng thái đầy đủ của một trận đấu, không phải là chỉ là chuỗi phù hợp. Tôi hy vọng bạn chỉ cần sử dụng RNumberD.Value (các string của văn bản phù hợp) thay cho chỉ RNumberD khi thêm nó như là một (sql) tham số:

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

(vv)

+0

THANKS cho sự giúp đỡ! –

Các vấn đề liên quan