0

我正在尝试制作一个实用程序来生成 SQL 表和关系表的插入脚本。

我得到了 C# 中的所有值。

现在我想从脚本中删除一个列名及其值。很可能是标识列。

例如:我拥有的字符串(随着表名不断变化并且变化)

INSERT INTO Core.Customers ([customerId], [customername], [customeradress],[ordernumber])
VALUES (123, N'Rahul', N'244 LIZ MORN', 2334)

现在我知道我必须删除CustomerId(有时需要替换为@somevariable)。

请给我一个有效的方法来检索customerId值和删除列名和值。

我正在寻找一种按列名称查找列值的方法。

我正在做的事情如下 - 我知道它效率低下并且可能导致问题,但现在它工作顺利。

public string GetColumnValueToForDesiredColumnName(string row, TableInfo tableinfo, string NameofColumnTOfindvalueFor)
{
    Dictionary<string, string> ValueTypedictionary = new Dictionary<string, string>();
    string value = null;

    // this code is quite messy - I need some suggestion on this one
    string[] plusseperatedinsert = row.Replace("INSERT " + "[" + tableinfo.Schema + "].[" + tableinfo.TableName + "]", string.Empty).Trim().Replace("VALUES", "+").Split('+');

    string[] columnvalues = plusseperatedinsert[0].Replace("(", string.Empty).Replace(")", string.Empty).Replace("(", string.Empty).Replace("[", string.Empty).Replace("]", string.Empty).Trim().Split(',');

    string[] valuesfield = plusseperatedinsert[1].Replace("(", string.Empty).Replace(")", string.Empty).Replace("(", string.Empty).Replace("[", string.Empty).Replace("]", string.Empty).Trim().Split(',');

        for (int index = 0; index < columnvalues.Length; index++)
        {
            ValueTypedictionary.Add(columnvalues[index], valuesfield[index]);
        }

        ValueTypedictionary.TryGetValue(NameofColumnTOfindvalueFor, out value);

        return value;
    }

这将返回 123 作为值。

然后我正在使用

string.Replace("[customerId],", string.empty).Replace(123, string.empty); 
4

1 回答 1

0

创建一个特殊的类InsertQuery,它存储成对的列名和列值,然后如果您总是需要删除或更改表的 Id,您将知道它位于列表/数组的第一个索引上/无论您使用什么来存储这些对。

定义删除此列的方法,您就可以开始了。

所以这里是代码。你可能会以某种方式改变它,这只是一个概念证明。

public class InsertQuery
{
    private class Column
    {
        public string Name { get; set; }
        public string Value { get; set; }
    }

    private readonly List<Column> columns = new List<Column>();
    private readonly string tableName;

    public InsertQuery(string tableName)
    {
        this.tableName = tableName;
    }

    public void AddColumn(string name, string value)
    {
        columns.Add(new Column { Name = name, Value = value });
    }

    public string RemoveColumnByName(string columnName)
    {
        var column = columns.First(c => c.Name == columnName);
        var value = column.Value;
        columns.Remove(column);
        return value;
    }

    public string RemoveIdColumn()
    {
        var column = columns.First();
        var value = column.Value;
        columns.RemoveAt(0);
        return value;
    }

    public override string ToString()
    {
        var sb = new StringBuilder();
        sb.Append("INSERT INTO ");
        sb.Append(tableName);
        sb.Append(" (");

        // append first all column names and then their values

        return sb.ToString();
    }
}

相信我。仅使用字符串操作来构建这样的工具并不是一个好主意。随着时间的推移,您将想要添加更多功能,并且您将被难以扩展的代码所困扰。封装是一种方法。

于 2013-11-09T09:50:06.710 回答