如何将列中的所有行乘以3?

时间:2016-01-09 14:09:42

标签: mysql vb.net

例如,我在一列中有10,20和30,然后我希望所有这些都乘以3。

con.Open()
cmd.CommandText = " select * from pawns where item_no = '" & txtID.Text & "' and second_date <= NOW(); "
dr = cmd.ExecuteReader

If dr.HasRows Then
    dr.Read()
    b = dr.Item("total_amount") * 3     
    dr.Close()
End If

2 个答案:

答案 0 :(得分:1)

这可以在SQL中完成,如下面示例代码中所示,其中假设没有空值。所有代码都有Option Strict On并使用xml文字来创建sql语句。

注意:这是通过SQL-Server完成的,但同样适用于通过托管.NET数据提供程序的所有数据库。

Dim SearchValue As Integer = 12
' create nicely formatted statement with xml literals
Dim SelectStatement As String =
    <SQL>
        SELECT 
            ID, 
            item_no, 
            total_amount, 
            ItemDescription, 
            ([total_amount]*3) AS Total 
        FROM Table1 
            WHERE item_no = @ItemIdentifier));                
    </SQL>.Value

Using cn As New SqlClient.SqlConnection With {.ConnectionString = "TODO"}
    Using cmd As New SqlClient.SqlCommand With {.Connection = cn, .CommandText = SelectStatement}

        ' strong type parameter optionally use AddWithValue
        cmd.Parameters.Add(New SqlClient.SqlParameter With
                           {
                               .ParameterName = "@ItemIdentifier",
                               .SqlDbType = SqlDbType.Int,
                               .Value = SearchValue
                           }
                       )

        cn.Open()

        Dim reader As SqlClient.SqlDataReader = cmd.ExecuteReader

        If reader.HasRows Then

            While reader.Read
                Console.WriteLine("Description: {0} Total: {1}",
                                  reader.GetString(3),
                                  reader.GetInt32(4))
            End While

            reader.Close()
        End If
    End Using
End Using

SQL也可以按如下方式完成

Dim SelectStatement As String =
    "SELECT ID, item_no, total_amount, ItemDescription, (total_amount * 3) AS Total " &
    "FROM Table1  WHERE item_no = @ItemIdentifier));"

建议使用SELECT *来选择数据,而是始终指定所需的字段。

答案 1 :(得分:0)

我认为您的问题可能是SqlDataReader.Item返回一个对象,而不是一个数字。在这一点上,你的糟糕代码不知道,如果dr.Item("total_amount")将返回一个字符串,一个字节数组,一个整数,一个日期......它正在等待 - 屏住呼吸 - 为你。 ..错误...告诉它。

所以......告诉它:

b = CType(dr.Item(“total_amount”),Double)* 3

除非total_amount是一个可以为空的bigint值...然后,你还有更多工作要做。

If IsDBNull(dr.Item("total_value")) Then
    Return 0;
Else
    Return CType(dr.Item("total_value"), long)
End If

当然,在这一点上......你是如此接近扩展方法,你几乎闻到它!如果你能打电话给dr.GetOrDefault(of long)("total_value",0),那会不会更容易......是的。那很酷。比如...... dr.GetSqlInt64(0),但是列名是......

<System.Runtime.CompilerServices.Extension()>
Function GetOrDefault(Of T)(dr As SqlDataReader, name As String, [default] As T) As T
    If IsDBNull(dr.Item(name)) Then
        Return [default]
    Else
        Return CType(dr.Item(name), T)
    End If
End Function

呀。那很酷。你应该写那样的东西。它节省了很多代码时间。