【问题标题】:Index (zero based) must be greater than or equal to zero and less than the size of the argument list索引(从零开始)必须大于或等于零且小于参数列表的大小
【发布时间】:2024-04-25 13:10:02
【问题描述】:

我正在尝试在数据库中创建一个新表,该表具有结帐名称和我放入 {0} 的支票号码。但是当我运行程序时,它会出现“Productlist varchar(50)”标题中显示的错误

SQLiteCommand tableCreateCommand = myConnection.CreateCommand();
tableCreateCommand.CommandText = string.Format("create table Checkout{0} (ID int, Productlist varchar{0}, Date varchar {0}, Time varchar (50), Total double)");
tableCreateCommand.ExecuteNonQuery();

【问题讨论】:

  • 在运行命令之前,您是否将{0} 替换为其他文本?如果是这样,你能告诉我们替代品吗?不然{0}的目的是什么?

标签: c# database sqlite


【解决方案1】:

您在各个地方调用string.Format,包括{0},表示您希望替换占位符...但您没有提供占位符值。

你想要这样的东西:

tableCreateCommand.CommandText = string.Format("...", checkNumber);

但是,我怀疑您实际上需要多个参数({0}{1}{2} 等)而不仅仅是一个。从string.Format 的结果中期待什么 SQL?

【讨论】:

  • 我有 Checkout{0} 的原因是有多个结帐可以向服务器发送交易,因此 {0} 代表结帐编号
  • @TweedyMK:但你在另外两个地方使用{0}。你期望有什么价值?以及您如何期望string.Format 获得结帐号码?
【解决方案2】:

您没有为 String.Format 中的占位符指定任何值。

string.Format("create table Checkout{0} (ID int, Productlist varchar{0}, 
Date varchar {0}, Time varchar (50), Total double)",  <you need to specify  
the list of values for place holders here...>)

应该是这样的。请注意从第二个参数开始指定的值。您可以使用常量或某个变量来代替此处显示的常量。逗号后指定的值将替换索引顺序中的占位符。 {0} 将使用值 123456{1} 将使用 50{2} 将使用 65{3} 将使用 >75

string.Format("create table Checkout{0} (ID int, Productlist varchar({1}), 
Date varchar({2}), Time varchar ({3}), Total double)", 123456, 50, 65, 75)

如果您需要为结帐指定的 varchar 使用相同的占位符,则应该是这样的。我不确定这是否是您的意图。这里所有占位符 {0} 都将使用相同的值 100。

string.Format("create table Checkout{0} (ID int, Productlist varchar({0}), 
Date varchar({0}), Time varchar (50), Total double)", 100)

【讨论】:

    【解决方案3】:

    您尚未将字符串传递给 string.Format,它需要将其放入您的 {0} 占位符。是否缺少变量?

    ...string.Format("your long format string {0}", someMissingStringVar);
    

    【讨论】:

      【解决方案4】:

      在此示例中,您使用包含占位符 {0} 的字符串调用了 String.Format,但未提供任何参数。您需要删除占位符或提供参数以填写 {0} 插槽

      如果您想将{0} 直接放入字符串中,请不要使用String.Format 或通过{{0}} 正确转义它们。

      【讨论】: