将动态查询中的getdate()作为参数传递

时间:2016-07-28 08:09:12

标签: c# sql sql-server tsql

大家早上好!我正在构建一个带有参数的动态查询,如下面的代码所示。

     c.Open();
                string columns = "(";
                string values = "(";
                foreach (DataGridViewColumn column in rootDataView.Columns)
                {
                    if (virtualColumns.Contains(column.Name))
                    {
                    }
                    else
                    {
                        columns += column.Name + ",";
                        values += "@" + column.Name + " ,";
                    }
                }
                columns = columns.Substring(0, columns.Length - 1) + ")";
                values = values.Substring(0, values.Length - 1) + ")";
                SqlCommand command = new SqlCommand("insert into " + tableName + " " + columns + " Values " + values, c);
                foreach (DataGridViewColumn column in rootDataView.Columns)
                {
                    if (virtualColumns.Contains(column.Name))
                    {
                    }
                    else
                    {
                        if (column.Name != "timeFrom")
                        {
                            command.Parameters.AddWithValue("@" + column.Name, editedRow.Cells[column.Name].Value);
                        }
                        else
                        {
                            command.Parameters.AddWithValue("@" + column.Name, System.DateTime.Now);
                        }
                    }
                }
                command.ExecuteNonQuery();

但我在这一行遇到了问题

command.Parameters.AddWithValue("@" + column.Name, System.DateTime.Now);

我需要将此时间与SQL服务器同步,因此我需要以某种方式将GETDATE()作为参数传递,但是当我像这样输入

command.Parameters.AddWithValue("@" + column.Name, "GetDate()");

它以字符串/ varchar的形式发送,因此它不会调用函数。

我想知道是否有办法将函数作为参数传递,或者我是否需要替换查询字符串的@timeFrom部分。

编辑:请注意粗体部分,这是问题 - 我要求是/否和解释原因

1 个答案:

答案 0 :(得分:2)

你必须尝试这样的事情:

            c.Open();
            string columns = "(";
            string values = "(";
            foreach (DataGridViewColumn column in rootDataView.Columns)
            {
                if (virtualColumns.Contains(column.Name))
                {
                }
                else
                {
                    columns += column.Name + ",";
                    if (column.Name != "timeFrom")
                    {
                        values += "@" + column.Name + " ,";
                    } else {
                        //change in string
                        values += "GETDATE() ,";
                    }
                }
            }
            columns = columns.Substring(0, columns.Length - 1) + ")";
            values = values.Substring(0, values.Length - 1) + ")";
            SqlCommand command = new SqlCommand("insert into " + tableName + " " + columns + " Values " + values, c);
            foreach (DataGridViewColumn column in rootDataView.Columns)
            {
                if (virtualColumns.Contains(column.Name))
                {
                }
                else
                {
                    if (column.Name != "timeFrom")
                    {
                        command.Parameters.AddWithValue("@" + column.Name, editedRow.Cells[column.Name].Value);
                    }
                }
            }
            command.ExecuteNonQuery();

基本上,您不会将timeFrom视为参数,而是使用GETDATE()在INSERT中设置它的值。

SQL Server和您使用的客户端库不支持传递包含SQL的参数。这就是为什么这个结构不起作用的原因:

command.Parameters.AddWithValue("@" + column.Name, "GetDate()");

允许在AddWithValue中传递的唯一内容是将转换为文字SQL值。