Как манипулировать необработанной строкой SQL с помощью C# - PullRequest
0 голосов
/ 24 января 2020

Я передаю базу данных. У меня есть шестьдесят тысяч строк SQL операторов вставки. Поскольку некоторые поля в старой базе данных отсутствуют в новой базе данных, мне нужно отредактировать имеющиеся у меня операторы.

Например:

INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")

выражение для новой базы данных должно быть:

INSERT INTO Product (Name,Count,Type,) VALUES ("Toys",4,"Child Toy")

этот процесс также действителен для различных структур таблиц, поэтому я ищу постоянное решение.

я пишу это решение:

string s="INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")"

s.Replace("Code", "");

Console.WriteLine(s);

но это решение очень примитивно как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Вы можете использовать существующие операторы, просто изменив имя таблицы.

Сначала создайте представление и триггер:

create view vwProduct as 
select  [Name], [Count], null as [Brand], [Type], null as [Code] from Product
create trigger ProductTrigger on vwProduct
instead of insert
as
begin
    insert into Product
    select [Name], [Count], [Type] from inserted
end;

Сейчас вы сможете запустить свои существующие операторы, просто изменив Product на vwProduct:

INSERT INTO vwProduct (Name,Count,Brand,Type,Code) VALUES ("Toys",4,NULL,"Child Toy","T001")
0 голосов
/ 24 января 2020

Я написал небольшое консольное приложение, которое добивается цели ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")");
            Console.WriteLine(GetCorrectedInsertStatement("INSERT INTO Product (Name,Count,Brand,Type,Code) VALUES (\"Toys\",4,NULL,\"Child Toy\",\"T001\")", "Brand", "Code"));

        }

        private static string GetCorrectedInsertStatement(string sqlInput, params string[] columnssToRemove)
        {
            string sqlOutput = string.Empty;

            if (columnssToRemove.Length == 0)
            {
                return sqlInput;
            }

            int indexOpenBracket = sqlInput.IndexOf('(');

            // Copy prepare sqlOutput with INSERT INTO [Table] ({0}) VALUES ({1})
            sqlOutput = sqlInput.Substring(0, indexOpenBracket) + "({0}) VALUES ({1})";

            // Remove INSERT INTO [COLUMN] from sqlInput
            sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);

            int indexCloseBracket = sqlInput.IndexOf(')');

            // Get Coumn1,Column2,... 
            string tmpColumns = sqlInput.Substring(1, indexCloseBracket - 1);

            // Split to get all columns
            List<string> columns = tmpColumns.Split(',').ToList();

            // Remove Coumn1,Column2,... from sqlInput
            sqlInput = sqlInput.Substring(indexCloseBracket, sqlInput.Length - indexCloseBracket);

            indexOpenBracket = sqlInput.IndexOf('(');

            // Remove VALUES from sqlInput
            sqlInput = sqlInput.Substring(indexOpenBracket, sqlInput.Length - indexOpenBracket);

//UPDATED the next line from IndexOf to LastIndex of.
            indexCloseBracket = sqlInput.LastIndexOf(')');

            // Get values to insert from sqlInput
            string tmpValues = sqlInput.Substring(1, indexCloseBracket - 1);

            // Split to get all values
            List<string> values = tmpValues.Split(',').ToList();

            // remove the columns and values that are no longer needed
            foreach (string columnToRemove in columnssToRemove)
            {
                int indexToRemove = columns.IndexOf(columnToRemove);
                columns.RemoveAt(indexToRemove);
                values.RemoveAt(indexToRemove);
            }

            // insert the columns and values into the sqlOutput
            sqlOutput = string.Format(sqlOutput, string.Join(", ", columns.ToArray()), string.Join(", ", values.ToArray()));
            return sqlOutput;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...