错误:对象类型不存在映射

时间:2022-10-29 16:49:19

Here is the code for my simple parsing application. I am getting an error that states 'No mapping exists from type System.Text.RegularExpressions.Match to a known managed provider native type'. This started to occur when I switched from using Split('_') to RegEx.Match for defining RNumberE, RNumberD, etc. Any guidance is appreciated.

下面是我的简单解析应用程序的代码。我得到一个错误,表明System.Text.RegularExpressions类型不存在映射。匹配已知的托管提供程序本机类型'。当我从使用Split('_')切换到RegEx时,就会发生这种情况。匹配定义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();

            }
        } 
    } 
} 

1 个解决方案

#1


11  

In the original code, RNumberD etc are string - most code (SqlParameter being the most likely) can handle this. In the revised code, it is a regex Match, which is a complex object representing the full state of a match, not just the matched string. I expect you simply need to use RNumberD.Value (the string of the matched text) in place of just RNumberD when adding it as a (sql) parameter:

在原始代码中,RNumberD等是字符串——大多数代码(SqlParameter是最可能的)都可以处理这个问题。在修改后的代码中,它是一个regex匹配,它是一个复杂的对象,表示匹配的全部状态,而不只是匹配的字符串。我想你只需要使用RNumberD。值(匹配文本的字符串)代替RNumberD作为(sql)参数添加时的值:

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

(etc)

(等)

#1


11  

In the original code, RNumberD etc are string - most code (SqlParameter being the most likely) can handle this. In the revised code, it is a regex Match, which is a complex object representing the full state of a match, not just the matched string. I expect you simply need to use RNumberD.Value (the string of the matched text) in place of just RNumberD when adding it as a (sql) parameter:

在原始代码中,RNumberD等是字符串——大多数代码(SqlParameter是最可能的)都可以处理这个问题。在修改后的代码中,它是一个regex匹配,它是一个复杂的对象,表示匹配的全部状态,而不只是匹配的字符串。我想你只需要使用RNumberD。值(匹配文本的字符串)代替RNumberD作为(sql)参数添加时的值:

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

(etc)

(等)