2010-05-31 4 views
8

Voici le code de mon application d'analyse simple. J'obtiens une erreur qui indique 'Aucun mappage n'existe à partir du type System.Text.RegularExpressions.Match vers un type natif de fournisseur géré connu'. Cela a commencé à se produire lorsque je suis passé de Split ('_') à RegEx.Match pour définir RNumberE, RNumberD, etc. Toute indication est appréciée.Erreur: Aucun mappage n'existe à partir du type d'objet

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

      } 
     } 
    } 
} 

Répondre

11

Dans le code d'origine, RNumberD etc sont string - la plupart du code (SqlParameter étant le plus probable) peut gérer cela. Dans le code révisé, il s'agit d'une expression regex Match, qui est un objet complexe représentant l'état complet d'une correspondance, pas juste la chaîne correspondante. Je pense que vous devez simplement utiliser RNumberD.Value (le string du texte correspondant) au lieu de seulement RNumberD lors de l'ajout comme un (sql) paramètre:

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

(etc)

+0

MERCI pour l'aide! –

Questions connexes