【问题标题】:Why does my insert work but not the select? [closed]为什么我的插入有效但选择无效? [关闭]
【发布时间】:2022-01-07 10:05:16
【问题描述】:

所以这很奇怪。我正在尝试从我的 C# 应用程序到我的本地数据库进行简单的选择,但它不起作用。我知道查询是正确的,而且我的连接也有效,因为我能够进行插入。我想要的是能够将我的数据从选择中放入数据表中。很简单,以前做过,现在不行了……

这是我提到的两个查询:

"SELECT idUsuario 
FROM taxi.dbo.Usuario 
WHERE nombre = '" + usuario + "'"

其中usuario 是数据库中存在的实际名称。这个不行。

但是,这个可行:

USE [Taxi] 

INSERT INTO [dbo].[Usuario]([nombre], [correo], [tlf],[metodo_pago], [contrasena])
VALUES('" + usuario.nombre + "','" + usuario.correo + "','" + usuario.tlf + "','" + usuario.tarjeta  + "', '" + usuario.contrasena + "')"

我的完整代码:

public DataTable ejecutaConsultaDataTable(String consulta)
{
    SqlDataAdapter da = new SqlDataAdapter();

    DataTable dt = new DataTable();

    SqlCommand c = new SqlCommand(consulta, con); //Defino la consulta a realizar.

    try
    {
        this.connection();    // Abro la conexión

        da.SelectCommand = c;

        da.Fill(dt);   // relleno tabla con el resultado de la consulta

        this.closeConnection();

        return dt;
    }
    catch //(Exception ex)   // Tratamiento de errores en la conexión
    {
        this.closeConnection();   // Cierro conexión
        return null;
    }
}

public int ejecutaConsulta(String consulta)
{
    SqlDataAdapter da = new SqlDataAdapter();

    SqlCommand c = new SqlCommand(consulta, con); //Defino la consulta a realizar.

    try
    {
        this.connection();    // Abro la conexión
        da.SelectCommand = c;
        c.ExecuteNonQuery();
        this.closeConnection();

        return 0;
    }
    catch //(Exception ex)   // Tratamiento de errores en la conexión
    {
        this.closeConnection();   // Cierro conexión
        return -1;
    }
}

这是我使用的代码:

consulta == query
con == connection

谢谢你顺便说一句:)

【问题讨论】:

  • 永远不要使用字符串连接来创建 SQL 命令。这使您的代码容易受到 SQL 注入攻击。改用参数化查询,
  • 您能否更具体地说明“不起作用”的确切含义?
  • 请使用参数化查询 - 通过连接等方式构建 SQL 查询是灾难的根源。它不仅是许多难以调试的语法错误的来源,而且还是 SQL Injection attacks 的大门。 (不:它不能经常重复)
  • 您正在捕获异常,但您已经删除了可以告诉您传递的 sql 中有什么问题的代码。重新插入 Exception ex,然后以某种方式显示 ex.Message 属性的内容。然后我们可以试着去理解这个问题。 (显示取决于您编写的应用程序类型)
  • 顺便说一下,似乎 usuario 是某个类的实例,而 nombre 属性包含要搜索的数据。连接变量 usuario 的名称不会为您提供 nombre 属性。但是,请查看其他 cmets,不要使用串联来构建查询。

标签: c# sql select datatable insert


【解决方案1】:

如果您想使用数据表,以下是让生活变得轻松和安全的方法:

  • 将新的 DataSet 文件添加到您的项目中
  • 双击打开,右击surface并选择Add TableAdapter
  • 通过向导,输入您的连接字符串,然后是查询
    • 当您需要 SQL 字符串中的某个参数时,通过在参数名称前加上 @ 前缀将其键入到向导中,如下所示:SELECT * FROM taxi.dbo.Usuario WHERE nombre = @usuario
    • 当您有一个带有参数的查询时,一定要给它一个好名字,例如“FillByUsuario” - 不要将其保留为默认的“Fill”或“FillBy”
  • 完成向导

您将看到您的数据库表的表示形式出现,可能与表适配器 (UsuarioTableAdapter) 一起称为 Usuario。如果您查看 tableadapter 的属性,您会发现它有一个 InsertCommand(一个用于更新、删除),已经为您填写好,还有参数。VS 为您编写了大量好的代码(它是如果您想查看它,所有这些都在 YourDataSet.Designer.cs 文件中

要在您的代码中使用这些新功能,只需执行以下操作:

var ta = new UsuarioTableAdapter();
var dt = ta.GetDataByUsuario("hello, put a usuario here");

这就是你所要做的一切

如果要进行更改,并将其保存到数据库中:

dt[0].Nombre = "John";
dt[0].Correo = "1, the street";

ta.Update(dt);

您可以向表适配器添加任意数量的查询,但它们应该与表相关。右键单击 UsuarioTableAdapter 并选择添加查询。添加另一个,可能是SELECT * FROM Usuario WHERE Correo LIKE @correo - 称之为 FillByCorreo/GetDataByCorreo。从代码中调用它:

var dt = ta.GetDataByCorreo("% address here %");

【讨论】:

  • 将尝试参数化。因为似乎没有其他方法起作用。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2021-08-28
  • 2012-02-04
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多