更改表,通过参数传递dataype会导致语法错误

时间:2015-12-04 01:40:09

标签: c# sql visual-studio

我使用Visual Studio创建程序。在这个程序中,我必须查找所有创建的表,并查看列表中的列是否存在,如果没有创建它。为此,我创建了这个变量:

<nav>
<div class="wrapper">
  <ul id="menu" class="clearfix">
    <li><a href="#">Home</a></li>
    <li><a href="#">Categories</a>
      <ul>
        <li class="purple"><a href="#">Design</a>
          <ul>
            <li><a href="#">Photoshop</a></li>
            <li><a href="#">Illustrator</a></li>
            <li><a href="#">InDesign</a></li>
          </ul>
        </li>
        <li class="green"><a href="#">Writing</a>
          <ul>
            <li><a href="#">Copywriting</a></li>
            <li><a href="#">Journalism</a></li>
            <li><a href="#">Poetry</a></li>
            <li><a href="#">Storytelling</a></li>
            <li><a href="#">Copywriting</a></li>
            <li><a href="#">Journalism</a></li>
            <li><a href="#">Poetry</a></li>
            <li><a href="#">Storytelling</a></li>
          </ul>
        </li>
        <li class="aqua"><a href="#">Accounting</a>
          <ul>
            <li><a href="#">Taxes</a></li>
            <li><a href="#">Credit</a></li>
            <li><a href="#">Asset Management</a></li>
          </ul>
        </li>
        <li class="red"><a href="#">Marketing</a>
          <ul>
            <li><a href="#">Print</a></li>
            <li><a href="#">Digital</a></li>
            <li><a href="#">Branding</a></li>
            <li><a href="#">Presenting</a></li>
            <li><a href="#">Social Media</a></li>
          </ul>
        </li>
        <li class="blue"><a href="#">Development</a>
          <ul>
            <li><a href="#">HTML5/CSS3</a></li>
            <li><a href="#">jQuery</a></li>
            <li><a href="#">PHP</a></li>
            <li><a href="#">Ruby on Rails</a></li>
          </ul>
        </li>
        <li class="gold"><a href="#">Photography</a>
          <ul>
            <li><a href="#">Mechanics</a></li>
            <li><a href="#">Composition</a></li>
          </ul>
        </li>
      </ul>
    </li>
    <li><a href="#">About</a>
      <ul>
        <li><a href="#">History</a></li>
        <li><a href="#">The Team</a></li>
        <li><a href="#">Our Mission</a></li>
      </ul>
    </li>
  </ul>
</div>
</nav>

$(function(){
    var defaultMenuHeight = 0;
    $('a[href="#"]').on('click', function(e){
                        e.preventDefault();
                    });

    $('#menu > li').on('mouseover', function(e){
                        var menuItem = $(this);
                        menuItem.find('> a').mouseover(function(e){
                            $(this).next().css({"padding-bottom":0});
              defaultMenuHeight = menuItem.find('ul').actual('outerHeight');
           });
        $(this).find("ul:first").show();
        $(this).find('> a').addClass('active');
        //HERE FIX
        if(defaultMenuHeight == 0){
            defaultMenuHeight = menuItem.find('ul').actual('outerHeight');
        }
    }).on('mouseout', function(e){
          $(this).find("ul:first").hide();
          $(this).find('> a').removeClass('active');
       });

    $('#menu li li').on('mouseover',function(e){
        if($(this).has('ul').length) {
            $(this).parent().addClass('expanded');
            var ttlLiHeight = 0;
            $(this).find('ul li').each(function() {
                var curLiHeight = $(this).actual('innerHeight');
                ttlLiHeight += curLiHeight;
            });
            if(ttlLiHeight >= defaultMenuHeight){
                var difference = ttlLiHeight-defaultMenuHeight;
                $(this).parent('#menu li ul').css({"padding-bottom":difference});
            }else{
                $(this).parent('#menu li ul').css({"padding-bottom":0});
            }
            $('#result').html("Default Height: " + defaultMenuHeight + "<br>padding bottom: " + difference);
        }
        $('ul:first',this).parent().find('> a').addClass('active');
        $('ul:first',this).show();
    }).on('mouseout',function(e){
         $(this).parent().removeClass('expanded');
         $('ul:first',this).parent().find('> a').removeClass('active');
         $('ul:first', this).hide();
      });
});

代码如下:

Dictionary<string, List<Dictionary<string, string>>> TABLE_DICT //the string saves the name of the table, the list the columns and types
List<Dictionary<string, string>> TABLE_LIST = new List<Dictionary<string, string>>(); //list of columns in a table with its type
Dictionary<string, string> DICT = new Dictionary<string, string>(); // name of column and the type of this column

问题是代码捕获语法错误的异常,即使我为下面的stll命令文本也会出现语法错误:

try
            {
                conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBstring);
                conn.Open();
                foreach (KeyValuePair<string, List<Dictionary<string, string>>> TABLE_kvp in TABLE_DICT)
                {
                    foreach (Dictionary<string, string> dic in TABLE_kvp.Value)
                    {
                        foreach (KeyValuePair<string, string> kvp in dic)
                        {
                            DataTable dt = conn.GetSchema("Columns", new string[] { null, null, TABLE_kvp.Key, kvp.Key });
                            if (dt.Rows.Count == 0)
                            {
                                OleDbCommand command = new OleDbCommand();
                                command.Connection = conn;
                                command.CommandText = "ALTER TABLE ? ADD COLUMN ? ? ";
                                command.Parameters.AddWithValue("@tablename", TABLE_kvp.Key);
                                command.Parameters.AddWithValue("@col", kvp.Key);
                                command.Parameters.AddWithValue("@val", kvp.Value);
                                command.ExecuteNonQuery();
                                command.Connection.Close();
                            }
                        }
                    }
                }
            }
            catch (OleDbException ex)
            {
                ErrorForm ef = new ErrorForm(ex.Message, this.BackColor);
                ef.ShowDialog(this);
            }

在Google中搜索,至少是列表中的最后一个,不必出错,或者这是我所相信的,但仍然如此。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

DDL语句不能参数化。您需要在代码中连接它。而且因为你需要这样做,你必须

  • 验证参数
  • 绝对确保您的参数可信。

带验证的示例代码:

var validator = new Regex(@"^\w+$");
if (new[] { TABLE_kvp.Key, kvp.Key, kvp.Value }.All(validator.IsMatch))
{
    command.CommandText = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2}", 
        TABLE_kvp.Key,
        kvp.Key,
        kvp.Value);   
}

答案 1 :(得分:0)

绑定变量/参数仅用于值,不用于表名。您必须将表名更改为应用程序逻辑的一部分。

除此之外,您无法使用参数运行DDL命令。它仅适用于DML(INSERT或UPDATE或DELETE或调用存储过程)