【问题标题】:What SqlDbType should be used when creating a table?创建表时应该使用什么SqlDbType?
【发布时间】:2015-08-08 01:38:53
【问题描述】:

我不知道这是否真的需要...但我希望尽可能编写健壮的代码,所以:

创建表时应该使用什么SqlDbTypeSqlDbType.NChar?或者 Unicode 表名会有问题吗?或者可能是Var 类型之一,因为长度未知?我习惯于在数据库行而不是表的上下文中考虑这些类型,所以我不确定这里应该使用什么。

编辑

例如这样一行:

sqlCommand.Parameters.Add(new SqlParameter(parameterName,SqlDbType.NChar){ Value = value });

对于CREATE TABLE 命令。

【问题讨论】:

  • 您尝试精确参数化哪个值?
  • @SonerGönül 该值是一个简单的字符串,例如table1。我只是要求正确的 SqlDbType
  • SqlDbType 的文档说它适用于字段,而不是表。
  • @DanBracuk 我不确定they meant 是否排除表格。以这种方式使用简直是不寻常的。但如果是这样 - 那么我如何 do 参数化表名?

标签: c# sql .net sql-server


【解决方案1】:

不能参数化您的表名或列名或任何其他数据库对象。您可以参数化您的值。

你可以仍然使用字符串连接它但是在我看来将你的表名作为输入太冒险了。您应该在将表名放入 SQL 之前对其进行非常严格的验证,或者将一组有效表名列入白名单,以避免SQL Injection 攻击。

除此之外,parameterized statements 仅适用于 DML Statements 而不是 DDL statements

【讨论】:

  • 谢谢。但我已经更新了这个问题。例如用于创建表。
  • @ispiro 即使您为列名找到了 正确 类型(根据您的评论,它看起来像 nvarchar(128) NOT NULL),在我看来,您不应该这样做。这不是参数化查询的用途。
  • 我完全同意不让用户选择表名。但是,我想用它来避免创建表名时的un故意错误。但正如我所说 - 我同意你的看法。
  • 我的代码失败了 Incorrect syntax near '@abc'. 所以看来你是对的。
【解决方案2】:

SQL Server 中的所有对象名称都是sysname 数据类型。不知道SqlDbType是否包含sysname,但功能上和nvarchar(128)是一样的,所以可以用这个。

【讨论】:

  • 谢谢。大概就是这样。 (我发现this answer 在谈论它)。
  • 我的代码以Incorrect syntax near '@abc'. 失败,所以它似乎无法完成。但是你的回答很有帮助。谢谢。
猜你喜欢
  • 2011-09-11
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2016-08-25
  • 2023-04-02
  • 2011-04-15
相关资源
最近更新 更多