none
关于送SQL参数的问题 RRS feed

  • 问题

  • 我这里用的是"数据集“的方式做了一个 select 查询,但在用IN做条件的时候,这个后面的参数用什么方式可以传进去

    就如:select * from t1 where id  in (@id),调用的时候  new  aaaa.select_db(传入一个参数)这种方式好像不行

    除了SQL拼接以外,还有什么可以直接送这个@ID值 

    另外,问一下,SQL传参用@来表示,那ORACLE用的是哪一种来表示,好像用@不行。 

    2017年9月13日 12:47

全部回复

  • 建议用存储过程+where in 临时表(临时表加索引可能增加或者降低性能,取决于读写比例)。确实要拼SQL的话,建议用Entity Framework,直接用Contains可读性高一些。

    另外,在拼sql的时候,语句越长,解析需要的事件越长。一个一万个参数的in,解析需要的时间会比执行100次100个参数的in长。

    参数前缀取决于数据提供者,可以用DbMetaDataColumnNames.ParameterMarkerFormat获得。



    Visual C++ MVP



    2017年9月13日 14:05
    版主
  • select * from t1 where id  in (@id)

    List<string>  arr=new List<string>() {  "'A',"'B'","'C'"};

    @id=string.Join(",",arr.ToArray());   //逗号分隔开,组成一个字符串。

    int类型例子相同


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年9月14日 0:42
  • 我用这个方式,没有取到数据

    返回0行

    2017年9月14日 1:23

  • Hi cpp_1,

    带参数的方式,你可以参考下面的代码:

       String connsql = @"Data Source=.;Integrated Security=True"; 
                DataTable dt = new DataTable(); // 
                try
                {
                    using (SqlConnection conn = new SqlConnection())
                    {
                        conn.ConnectionString = connsql;
                        conn.Open(); // 打开数据库连接
                        string sql = "exec('select * from Studentsinf where Age in ('+@Age+')')";
                        SqlCommand cmd = conn.CreateCommand();
                        cmd.CommandText = sql;
                        cmd.Parameters.Add(new SqlParameter("@Age", " 26, 32,43 "));
                        SqlDataAdapter myda = new SqlDataAdapter(cmd); // 
                        myda.Fill(dt); //  
                        conn.Close(); // 
    
                        //conn.ConnectionString = connsql;
                        //conn.Open(); // 打开数据库连接
                        //string sql = "exec('select * from Studentsinf where Age in ( select Age from Students) ')";
                        //SqlDataAdapter myda = new SqlDataAdapter(sql, conn); // 
                        //myda.Fill(dt); //  
                        //conn.Close(); // 
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("错误信息:" + ex.Message, "出现错误");
                }
                MessageBox.Show(dt.Rows.Count.ToString());

    或者你可以尝试直接新建一个视图,将你需要过滤的数值放进去,然后再SQL语句的in条件中加入。

             conn.ConnectionString = connsql;
                        conn.Open(); // 打开数据库连接
                        string sql = "exec('select * from Studentsinf where Age in ( select Age from Students) ')";
                        SqlDataAdapter myda = new SqlDataAdapter(sql, conn); // 
                        myda.Fill(dt); //  
                        conn.Close(); // 


    >>另外,问一下,SQL传参用@来表示,那ORACLE用的是哪一种来表示,好像用@不行。

    这个不是很清楚,请查阅ORACLE的官方文档。


    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月14日 3:01
    版主
  • 

    我是通过这种方式,生成一个插入对象在去调用的

    拼这个SQL,我知道怎么传,但用这种生成出来的,用这种 in (@cl) 就不能传参

    2017年9月14日 6:43

  • Hi cpp_1,

    上面使用@Age参数使用方式时ADO.NET中提供的。你必须使用代码进行访问[上面回复已经给了你详细的截图和测试结果]。

    请不要在工具查询中使用这些参数化结构。

    有关ASO.NET 方面的问题,请到ADO.NET 与 LINQ 论坛中提问。

    有关SQL Server的问题,请不要再C# 论坛提问。请到对应的SQL Server forums 提出你的问题。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月14日 6:53
    版主