【问题标题】:ASP.NET - Pass multiple values from textbox to Access database select queryASP.NET - 将多个值从文本框中传递到 Access 数据库选择查询
【发布时间】:2025-12-22 10:30:09
【问题描述】:

我正在制作一个 ASP.net Web 应用程序,它允许用户将值粘贴到多行文本框中并按下提交按钮。 单击按钮时,这将根据他们在文本框中输入的产品代码运行数据库查询。

我已经设法让文本框中的一个代码工作。但是,我正在努力做的是在文本框中允许多个产品代码。 如何拆分文本框中的值,以逗号分隔并在我的 ACCESS SQL 查询中使用?

下面的代码是我在文本框中使用的单行代码,效果很好。

string selectString = "SELECT Patt1, Description, Oversize FROM Item WHERE Patt1 = '" + TextBox1.Text + "'";

基本上,我想做的是使用相同类型的查询,但如下所示:

string selectString = "SELECT Patt1, Description, Oversize FROM Item WHERE Patt1 sInStatement";

其中 sInStatement 将是“IN (1234, 1235, 1236, 1237) **此处的代码将在 TextBox1 中找到,我需要用逗号等将其分开。

这个可以吗?

【问题讨论】:

  • 用户是在输入逗号还是在换行?您只需在新行或逗号或任何分隔符上拆分。但是文本框是控件的错误选择,太容易让用户输入错误的数据。使用某种列表控件。
  • 用户将从 Excel 工作表复制到此文本框中,他们将出现在文本框中的每一行。列表控件是否支持用户粘贴数据?
  • 对 excel 数据的粘贴支持可能需要自定义控件或一些 javascript。

标签: c# sql asp.net ms-access


【解决方案1】:

考虑一个存储过程,其参数与您希望能够传递的可选参数一样多。对可选参数使用超出范围的默认值,例如-999.

以下 SQL DDL 需要 ANSI-92 查询模式:

CREATE PROCEDURE GetItemsByPatt1s
( :arg1 INT,
  :arg2 INT = -999,
  :arg3 INT = -999,
  :arg4 INT = -999 ) AS
SELECT Patt1, Description, Oversize
  FROM Item 
 WHERE Patt1 IN ( :arg1, :arg2, :arg3, :arg4 );

【讨论】:

    【解决方案2】:

    可以修改SQL:

    string selectString = "SELECT Patt1, Description, Oversize FROM Item WHERE Patt1 IN ("' + string.Join("','", TextBox1.Text.Replace(" ", "").Split(',')) + "')";
    

    如果值是数字:

    string selectString = "SELECT Patt1, Description, Oversize FROM Item WHERE Patt1 IN (" + string.Join(",", TextBox1.Text.Split(',')) + ")";
    
    //or simply:
    
    string selectString = "SELECT Patt1, Description, Oversize FROM Item WHERE Patt1 IN (" + TextBox1.Text + ")";
    

    【讨论】:

    • 谢谢古斯塔夫。我已经尝试了上述方法,但它似乎没有像我预期的那样显示任何数据。当我输入两个或更多代码时,它没有显示任何数据。如果我在每行末尾的文本框中手动输入逗号,则会显示第一个代码,但之后没有更多数据
    • 理想情况下,我会寻找一种将文本框中的所有代码放入字符串中的方法,然后我可以将其传递给 SQL 语句
    • 恐怕这只会导致错误。产品代码在 ms-access 数据库中存储为短文本,因此不会被归类为数字
    • 哦,那您可能必须删除空格。见编辑。
    • 谢谢古斯塔夫。不幸的是,它仍然没有显示任何数据。当我在文本框中的每个产品代码的末尾手动添加一个逗号时,它会显示第一行的数据,然后什么都没有……但是没有手动添加逗号,根本就没有数据。
    【解决方案3】:

    可以,但将用户输入直接传递到 SQL 查询中是个坏主意。

    阅读SQL injection

    最好使用参数。

    【讨论】:

    • 感谢 Trifon。对于这种情况,Web 应用程序将仅在本地使用,即我不打算将其部署到网站。我将仅在本地网络上使用它。用户将无法使用 SQL 注入入侵数据库
    • 在企业中,当数据库(电子表格、wiki 等)证明有用时,更多的人/应用程序开始想要访问它。最好从正确的路径开始,并使用可以授予/拒绝权限的视图和过程。
    • 即便如此,你想做什么也不是个好主意。在这里查看具有拆分功能的解决方案:*.com/a/16872537/3260013