天道酬勤,学无止境

如何在 NpgsqlDataAdapter 中使用 SQL 参数?(How to use SQL parameters with NpgsqlDataAdapter?)

问题

是否可以像 NpgsqlCommand 一样将参数与 NpgsqlDataAdapter 一起使用:

          string sql = "SELECT * FROM tbl_student WHERE name = @val";
          NpgsqlCommand command = new NpgsqlCommand(sql, conn); 
          command.Parameters.AddWithValue("@val", name);

我有这个代码,它显示有关学生 ia gridview 的信息:

            string sql = "SELECT * FROM tbl_student WHERE studentname = '" + name + "'";               
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);    
            ds.Reset(); 
            da.Fill(ds);   // filling DataSet with result from NpgsqlDataAdapter
            dt = ds.Tables[0]; // select select first column
            GridView1.DataSource = dt;   //connect grid to DataTable           
            GridView1.DataBind();

我的问题是:我可以以某种方式使用参数(如上例所示)而不是在 SQL 中使用 '" + name + "' 吗? 一直学着用参数,用NpgsqlDataAdapter的时候也需要吗?

谢谢你。

回答1

我曾经有同样的问题,这就是我想出的:

    string sql = "SELECT * FROM tbl_student WHERE studentname = @param";
    NpgsqlCommand command = new NpgsqlCommand(sql,conn);
    command.Parameters.Add("@param", textBox_studentname.Text); //add the parameter into the sql command

    DataTable dt = new DataTable();
    //load the DataReader object of the command to the DataTable
    dt.Load(NpgsqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection));
    GridView1.DataSource = dt;

你可以读这个和这个。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C#和PostgreSQL(C# and PostgreSQL)
    问题 谁能给我展示一个使用从PLSQL返回到C#代码的游标的有效示例吗? 我发现了很多示例,这些示例说明了如何用返回的数据填充dataSet ,但是我找不到如何将光标与DataReader一起使用,因此,我有了{unnamed portal} 。 NpgsqlTransaction tr = (NpgsqlTransaction) Connection.BeginTransaction(); NpgsqlCommand cursCmd = new NpgsqlCommand("someStoredProcedure(:inRadius)", (NpgsqlConnection) Connection); cursCmd.Transaction = tr; NpgsqlParameter rf = new NpgsqlParameter("ref", NpgsqlTypes.NpgsqlDbType.Refcursor); rf.Direction = ParameterDirection.InputOutput; cursCmd.Parameters.Add(rf); 我必须添加它才能使用NpgsqlDataReader myReader; 正确地: tr.Commit(); 当我在sql命令后编写fetch ,它可以工作,但是不合适。 回答1 供你参考: /// <summary
  • 使用Dataadapter更新时发生DBConcurrency异常(DBConcurrency Exception Occured While Updating Using Dataadapter)
    问题 我想编辑DataTable通过填充NpgsqlDataAdapter 。 调用Fill()方法后,我在DataTable只有一行。 然后,我仅更改了一列的值,并尝试如下更新。 然后我得到这个错误: 发生DBConcurrencyException 我的代码是: NpgsqlDataAdapter getAllData = new NpgsqlDataAdapter("SELECT sn, code,product, unitprice, quantity, InvoiceNo, Date FROM stocktable WHERE Code='" + product + "' ORDER BY EDate ASC", DatabaseConnectionpg); DataTable ds1 = new DataTable(); ds1.Clear(); getAllData.Fill(ds1); if (ds1.Rows.Count > 0) { ds1.Rows[0]["Quantity"] = qty;// calculated value } ds1 = ds1.GetChanges(); NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(getAllData); //getAllData.RowUpdating +=
  • How to use SQL parameters with NpgsqlDataAdapter?
    Is it possible to use parameters together with NpgsqlDataAdapter, as I can do with NpgsqlCommand: string sql = "SELECT * FROM tbl_student WHERE name = @val"; NpgsqlCommand command = new NpgsqlCommand(sql, conn); command.Parameters.AddWithValue("@val", name); I have this code, which displays the information about the students i a gridview: string sql = "SELECT * FROM tbl_student WHERE studentname = '" + name + "'"; DataSet ds = new DataSet(); DataTable dt = new DataTable(); NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn); ds.Reset(); da.Fill(ds); // filling DataSet with result from
  • 是否可以使用 `SqlDbType.Structured` 在 NHibernate 中传递表值参数?(Is it possible to use `SqlDbType.Structured` to pass Table-Valued Parameters in NHibernate?)
    问题 我想将一组 id 传递给将使用 NHibernate 映射的存储过程。 这项技术是在Sql Server 2008中引入的(此处的更多信息=>表值参数)。 我只是不想在nvarchar参数中传递多个 id,然后在 SQL Server 端砍掉它的值。 回答1 我的第一个临时想法是实现我自己的IType 。 public class Sql2008Structured : IType { private static readonly SqlType[] x = new[] { new SqlType(DbType.Object) }; public SqlType[] SqlTypes(NHibernate.Engine.IMapping mapping) { return x; } public bool IsCollectionType { get { return true; } } public int GetColumnSpan(NHibernate.Engine.IMapping mapping) { return 1; } public void NullSafeSet(DbCommand st, object value, int index, NHibernate.Engine.ISessionImplementor session) { var s =
  • DBConcurrency Exception Occured While Updating Using Dataadapter
    I am trying to edit DataTable Filled by NpgsqlDataAdapter. After calling Fill() method, I have only one row in DataTable. Then I changed value of one column only and tried to update as below. Then I am getting this error: DBConcurrencyException occured My code is: NpgsqlDataAdapter getAllData = new NpgsqlDataAdapter("SELECT sn, code,product, unitprice, quantity, InvoiceNo, Date FROM stocktable WHERE Code='" + product + "' ORDER BY EDate ASC", DatabaseConnectionpg); DataTable ds1 = new DataTable(); ds1.Clear(); getAllData.Fill(ds1); if (ds1.Rows.Count > 0) { ds1.Rows[0]["Quantity"] = qty;//
  • C# 连接PostgreSQL获取数据库数据,展示在 dataGridView中
    一、C#连接postgresql 1.为了访问PostgreSQL数据库,需要下载Npgsql .Net Data Provider for Postgresql的组件。 打开Visual Studio 2015——项目——管理NuGet程序包,搜索Npgsql,安装相对应.net 版本的程序包。 注:因为使用的是Net4.5,所以下载了Npgsql.4.0.9。 2.可以看到,安装后的文件在C#工程目录的packages目录中,加入到References中。 3.在需要使用Npgsql的C#文件头,加入如下的using语句 : using Npgsql; 二、使用 1.在配置文件配置的方法:配置文件App.config中加入如下语句: <!--要访问的数据库IP地址、端口号、数据库名称、数据库登录名、密码。遇到乱码 加上Encoding--> <connectionStrings> <add name="postgre" connectionString="Host=localhost;Port=5432; User Id=postgres;Password=123;Database=yellowRiverData;"/> </connectionStrings> 在代码中获取配置文件中连接字符串:string connstr =ConfigurationManager
  • 如何在SQL Server Compact Edition中将参数与LIKE一起使用(How to use parameter with LIKE in Sql Server Compact Edition)
    问题 我正在尝试参数化使用LIKE关键字和通配符的搜索查询。 原始sql具有如下所示的动态sql: "AND JOB_POSTCODE LIKE '" + isPostCode + "%' " 所以我尝试了这个,但是却得到了FormatException: "AND JOB_POSTCODE LIKE @postcode + '%' " 编辑:我猜想FormatException不会来自Sql Server CE,所以根据要求,这是我在C#代码中设置参数的方式。 该参数是在代码中设置的,如下所示: command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 我也尝试过: "AND JOB_POSTCODE LIKE @postcode" 和 command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode + "%"; 但这不会返回任何结果。 任何人都可以建议如何在此搜索sql中使用参数吗? 回答1 简短的答案是,您应该将通配符放在参数的Value中,而不要放在CommandText中。 IE 不是那样的: sqlCommand.CommandText = "SELECT * FROM JOB WHERE
  • 如何在带参数的SQL查询中使用通配符(How to use wildcards in SQL query with parameters)
    问题 说我有一个基本的查询,像这样: SELECT holiday_name FROM holiday WHERE holiday_name LIKE %Hallow% 这可以在我的sql查询窗格中很好地执行,并返回“万圣节”。 当我尝试在代码中使用带通配符'%'的参数时,会出现我的问题。 SqlConnection Connection = null; SqlCommand Command = null; string ConnectionString = ConfigurationManager.ConnectionStrings["SQLdb"].ConnectionString; string CommandText = "SELECT holiday_name " + "FROM holiday " + "WHERE holiday_name LIKE %@name%"; Connection = new SqlConnection(ConnectionString); try { Connection.Open(); Command = new SqlCommand(CommandText, Connection); Command.Parameters.Add(new SqlParameter("name", HolidayTextBox.Text)); var
  • 如何在VB中的SQL命令中使用参数“ @”(How to use parameters “@” in an SQL command in VB)
    问题 我有这段代码可以从VB中的文本框中的数据更新我的SQL数据库。 我需要使用参数,以防文本中包含tic标记,'或引号,“等。这是我所拥有的: dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") dbConn.Open() MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _ "'WHERE Number = 1", dbConn) MyDataReader = MyCommand.ExecuteReader() MyDataReader.Close() dbConn.Close() 这是我la脚的尝试,目的是根据我在网络上看到的内容来设置参数,对此我不太了解。 dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") dbConn.Open() MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text &
  • 如何查看查询中的参数?(How do I view the parameters in a query?)
    问题 为了调试我的代码,我想查看执行的显式 sql 查询。 我使用createQueryBuilder创建查询,我实现的最明确的事情是使用原始查询: $qb->getQuery()->getSQL(); 问题是我看到的不是参数而是持有人( ? )。 我在网上找到了一些解决方案,但它们适用于 1.3 和 1.4,而不适用于 Symfony-2。 想法? 谢谢! 回答1 您可以使用$query->getParameters()访问占位符使用的参数,因此您可以使用以下方法调试查询: $query = $qb->getQuery(); print_r(array( 'sql' => $query->getSQL(), 'parameters' => $query->getParameters(), )); 回答2 您可以使用以下方法轻松访问 SQL 参数。 $result = $qb->getQuery()->getSQL(); $param_values = ''; $col_names = ''; foreach ($result->getParameters() as $index => $param){ $param_values .= $param->getValue().','; $col_names .= $param->getName().','; } //echo
  • T-SQL:如何在动态SQL中使用参数?(T-SQL: How to use parameters in dynamic SQL?)
    问题 我有以下动态查询,该查询在没有WHERE子句的情况下也可以正常工作,该子句期望UNIQUEIDENTIFIER 。 当我通过它时,我没有得到结果。 我尝试了CAST和CONVERT ,但没有结果。 我可能做错了,有人可以帮忙吗? CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql 回答1 您必须将参数传递给sp
  • 如何在ADO.NET中将“ DEFAULT”指定为SQL参数值?(How do you specify 'DEFAULT' as a SQL parameter value in ADO.NET?)
    问题 我有一个针对SQL2005的参数化SQL查询,该查询是通过代码动态创建的,因此我使用ADO.NET SqlParameter类将sql参数添加到SqlCommand 。 在上述SQL中,我从具有默认值的表值函数中进行选择。 我希望动态sql有时为这些默认参数指定一个值,而其他时候我想指定应使用SQL DEFAULT (如表值函数中所定义)。 为了保持代码整洁,我不想动态添加SQL DEFAULT关键字并在使用非默认值时对其进行参数化,我只想将DEFAULT设置为SQLParameter的值。 我可以吗? 在这种情况下,最佳做法是什么? 回答1 SQL查询参数仅代替文字值。 您无法发送SQL关键字作为参数值,就像无法发送表标识符,列标识符,值列表(例如,对于IN谓词)或表达式一样。 参数的值始终被解释为文字值,就像在查询中包含带引号的字符串文字或数字文字一样。 抱歉,但是在准备查询之前,必须在SQL查询中包含一个SQL关键字。 回答2 AFAIK,告诉SQL Server使用默认值的唯一方法是通过DEFAULT关键字或将其从参数列表中排除。 这意味着必须在参数化的SQL语句中使用DEFAULT关键字。 因此,类似: Select ... From dbo.udf_Foo( DEFAULT, @Param2, @Param3, DEFAULT, .... )
  • 如何在python中使用SQL参数?(How do I use SQL parameters with python?)
    问题 我正在使用python 2.7和pymssql 1.9.908。 在.net中查询数据库,我将执行以下操作: using (SqlCommand com = new SqlCommand("select * from Customer where CustomerId = @CustomerId", connection)) { com.Parameters.AddWithValue("@CustomerID", CustomerID); //Do something with the command } 我试图弄清楚什么是python,更具体地说是pymssql。 我意识到我可以进行字符串格式化,但是似乎不能像参数那样正确地转义(我可能是错的)。 我该如何在python中做到这一点? 回答1 创建连接对象db : cursor = db.execute('SELECT * FROM Customer WHERE CustomerID = %s', [customer_id]) 然后使用所得cursor对象的任何fetch...方法。 不要被%s部分所迷惑:这不是字符串格式,而是参数替换(不同的DB API模块使用不同的语法进行参数替换-pymssql恰好使用了不幸的%s !-)。 来源:https://stackoverflow.com/questions/3410455
  • SQL:如何在 SELECT TOP @amount 中使用 TOP 参数? [复制](SQL: How do I use parameter for TOP like in SELECT TOP @amount? [duplicate])
    问题 这个问题在这里已经有了答案: 在 SQL Server 的 select 语句中使用带有 TOP 的变量而不使其成为动态 [重复] (3 个回答) 7年前关闭。 使用 vs2008 查询构建器,我试图进行一个查询来获取“ TOP ”命令的参数,然后我遇到一个错误“顶级表达式中的错误” 作品: SELECT TOP 5 * FROM dbo.SomeTable WHERE SomeColumn = SomeValue 不起作用: SELECT TOP @param1 * FROM dbo.SomeTable WHERE SomeColumn = SomeValue 替代文字 http://www.freeimagehosting.net/uploads/f9b9354577.jpg 回答1 需要括号,且仅适用于 SQL Server 2005 及以上 SELECT TOP (@param1) ... 回答2 对于旧版本的 SQL Server,您可以使用: SET ROWCOUNT @NumberOfResults SELECT * FROM MyTable SET ROWCOUNT 0 但是,您不应在 2008 上使用此技术: 使用 SET ROWCOUNT 不会影响下一版本的 SQL Server (2008) 中的 DELETE、INSERT 和 UPDATE 语句。
  • 如何在Postgres查询窗口中使用参数测试我的即席SQL(How to test my ad-hoc SQL with parameters in Postgres query window)
    问题 在Microsoft SQL Server中,要在查询窗口中测试如下内容: select * from Users where LastName = @lastname 我可以在命令之前添加它: declare @lastname varchar(16) set @lastname = 'Troy' 但是在PostgreSQL中,我找不到类似的方法。 看来我唯一能做的就是将参数名称直接替换为其值。 当即席查询变得复杂并且多次使用同一参数时,它会变得很困难。 有办法吗? 回答1 多种选择。 在CTE中提供参数以在纯SQL中具有“变量”: WITH var(lastname) AS (SELECT 'Troy'::varchar(16)) SELECT * FROM users, var v WHERE lastname = v.lastname; 这适用于任何查询。 由于CTE var保留一行,因此可以安全地在FROM子句的末尾附加CROSS JOIN实际上,最好在逗号后附加简短形式,因为显式联接语法在逗号前绑定。 附加表别名v是可选的,以进一步缩短语法。 或更便宜的没有CTE。 顺便说一句,为什么要用varchar(16)呢? 只需使用text : SELECT * FROM users JOIN (SELECT 'Troy'::text) var(lastname)
  • 如何在RPostgreSQL中使用参数(插入数据)(How to use parameters with RPostgreSQL (to insert data))
    问题 我正在尝试使用RPostgreSQL将数据插入到预先存在的PostgreSQL表中, RPostgreSQL我无法弄清楚SQL参数(准备好的语句)的语法。 例如,假设我要执行以下操作 insert into mytable (a,b,c) values ($1,$2,$3) 如何指定参数? 如果仅将参数放在...中,则dbSendQuery似乎无法理解。 我发现dbWriteTable可用于转储整个表,但不会让您指定列(因此对默认设置等dbWriteTable )。 而且无论如何,一旦我在那里获得数据,我将需要为其他查询知道这一点(所以我想这实际上并不是特定于插入的)! 当然,我只是缺少明显的东西... 回答1 由于相同的原因,我一直在寻找同一件事,那就是安全性。 显然dplyr软件包具有您感兴趣的功能。虽然几乎没有记录,但确实存在。 在此小插图中向下滚动到“ Postgresql”:http://cran.r-project.org/web/packages/dplyr/vignettes/databases.html 总而言之,dplyr提供了sql()和escape()函数,可以将其组合以生成参数化查询。 DBI包中的SQL()函数似乎以完全相同的方式工作。 > sql(paste0('SELECT * FROM blaah WHERE id = ', escape(
  • 如何使用sqlsrv和“?”在php中执行存储过程样式参数(How to execute a stored procedure in php using sqlsrv and “?” style parameters)
    问题 我看了看其他几个看起来(从标题中)与此相同的问题。 但是,我的情况有些不同。 以下工作(即我获得“成功”,并且我的数据库执行了使用给定变量运行过程时所期望的结果): $sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}"; $result = sqlsrv_query($myConn, $sql); if (!$result) { echo 'Your code is fail.'; } else { echo 'Success!'; } 我想通过使用参数创建SQL字符串来避免(或减少SQL注入的可能性)。 例如: $sql = "select * from aTable where col1 = ? AND col2 = ?"; $result = sqlsrv_query($myConn, $sql, array($var1, $var2)); //please note. This code WILL work! 但是,当我使用存储过程执行此操作时,它会失败。 它失败,没有通过sqlsrv_errors()报告的错误,没有在数据库中执行任何操作,并且$result === false 。 需要明确的是,以下失败: $sql = "MyDB.dbo.myProcedure ?, ?, ?"; $result =
  • 如何使用oledb参数更新表?(how to update a table using oledb parameters?)
    问题 我有一个表,其中包含三个字段,即LM_code,M_Name,Desc。 LC_code是一个自动生成的字符串ID,请保持该状态以更新M_Name和Desc。 我使用了普通的update命令,该值在运行时传递,但是这些字段没有得到更新。 我希望使用oledb参数可以更新字段。 这是我的代码。 public void Modify() { String query = "Update Master_Accounts set (M_Name='" + M_Name + "',Desc='" + Desc + "') where LM_code='" + LM_code + "'"; DataManager.RunExecuteNonQuery(ConnectionString.Constr, query); } 在DataManager类中,我正在执行查询字符串。 public static void RunExecuteNonQuery(string Constr, string query) { OleDbConnection myConnection = new OleDbConnection(Constr); try { myConnection.Open(); OleDbCommand myCommand = new OleDbCommand(query
  • 如何在不使用存储函数或过程的情况下,将C#ODP.NET中的Oracle Ref Cursor用作ReturnValue参数?(How to use an Oracle Ref Cursor from C# ODP.NET as a ReturnValue Parameter, without using a Stored Function or Procedure?)
    问题 我需要帮助了解如果我尝试将Ref Cursor用作多个记录/值的ReturnValue参数的方式(PL / SQL只是OracleCommand对象的CommandText而不是存储过程或函数中的方式)是否均匀可能的。 如果这不可能,那么我想做的就是找到一种发出PL / SQL语句的方法,该语句将更新未知数量的记录(取决于与WHERE子句匹配的记录数),并返回所有记录使用Oracle到数据库的单次往返更新,而不使用存储过程或函数在OracleDataReader中进行更新。 我正在使用ODP.NET与Oracle 11g进行通信,以与使用SQL连接来检索/修改数据的现有C#.NET 4.0代码库进行通信。 我正在使用的简化测试表定义如下所示: CREATE TABLE WorkerStatus ( Id NUMERIC(38) NOT NULL ,StateId NUMERIC(38) NOT NULL ,StateReasonId NUMERIC(38) NOT NULL ,CONSTRAINT PK_WorkerStatus PRIMARY KEY ( Id ) ) 我用三个测试值预填充了表格,如下所示: BEGIN EXECUTE IMMEDIATE 'INSERT INTO WorkerStatus (Id, StateId, StateReasonId)
  • 如何将用户提供的输入添加到SQL语句?(How can I add user-supplied input to an SQL statement?)
    问题 我正在尝试使用用户提供的数据创建一个SQL语句。 我在C#中使用与此类似的代码: var sql = "INSERT INTO myTable (myField1, myField2) " + "VALUES ('" + someVariable + "', '" + someTextBox.Text + "');"; var cmd = new SqlCommand(sql, myDbConnection); cmd.ExecuteNonQuery(); 而这在VB.NET中: Dim sql = "INSERT INTO myTable (myField1, myField2) " & "VALUES ('" & someVariable & "', '" & someTextBox.Text & "');" Dim cmd As New SqlCommand(sql, myDbConnection) cmd.ExecuteNonQuery() 然而, 当用户输入中包含单引号(例如O'Brien )时,此操作将失败, 插入DateTime值和人们不断告诉我,由于“ SQL注入”,我不应该这样做。 我如何“正确地做”呢? 回答1 使用参数化的SQL。 例子 (这些示例在C#中,请参见下面的VB.NET版本。) 用@...占位符替换字符串串联