我在尝试从DateTime选择器中获取日期以保存到我的数据库时遇到了很多麻烦。它从Localhost运行时工作正常,但在公共服务器上运行时它不会。 最初我使用了cDate函数,还尝试了Convert.ToDateTime。但是在服务器上它现在给我一个错误"字符串未被识别为有效的DateTime。"
我研究并发现它最好使用DateTime.TryParse函数。找到一个例子后,我为我的项目更改了它,现在我得到了错误"必须声明标量变量" @ articledate"。"
当我调试项目时,将值添加到" result1" DateTime是正确的。但它仍然会在ExecuteNonQuery中抛出错误?
如果它有所不同,主服务器托管GoDaddy,Localhost是我的PC。
非常感谢任何帮助或建议。
cnSQL1 = New SqlConnection(MSSQL.cRemoteConnectionString)
cnSQL1.Open()
sSQL = "SELECT NewsID FROM News WHERE Season = @season AND Heading = @heading AND ArticleDate = @articledate AND Author = @author AND Club = @club AND State = @state AND AddedDate = @addeddate AND AddedBy = @addedby AND Release = @release"
Dim com1 As New SqlCommand(sSQL)
com1.Connection = cnSQL1
com1.Parameters.AddWithValue("@season", General.sSeason)
com1.Parameters.AddWithValue("@heading", General.UppercaseFirstLetter(txtHeading.Text))
Dim result1 As DateTime
com.Parameters.AddWithValue("@articledate", DateTime.TryParseExact(txtArticleDate.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, result1))
'com1.Parameters.AddWithValue("@articledate", Convert.ToDateTime(txtArticleDate.Text))
com1.Parameters.AddWithValue("@author", txtAuthor.Text)
com1.Parameters.AddWithValue("@club", ddlClub.SelectedItem.Value)
com1.Parameters.AddWithValue("@state", dsState.Tables(0).Rows(0).Item(0))
com1.Parameters.AddWithValue("@addeddate", Date.Today)
com1.Parameters.AddWithValue("@addedby", Session("UserID"))
com1.Parameters.AddWithValue("@updatedate", Date.Today)
com1.Parameters.AddWithValue("@updateby", Session("UserID"))
com1.Parameters.AddWithValue("@release", s)
com1.ExecuteNonQuery()
答案 0 :(得分:1)
错误"必须声明标量变量" @ articledate" 是由拼写错误引起的。添加参数时,应使用名为 com1 的SqlCommand变量而不是变量 com 。
但在此之后你会遇到更严重的错误。所有TryParse方法都返回布尔值。转换后的日期写在传递给TryParse的最后一个参数中。
通过这种方式,您将布尔值传递给com
,此方法将接受您在value参数中放置的任何内容。它无法知道你想要一个约会,所以它很乐意遵守你的要求。
你应该这样做(注意要使用的SqlCommand是Dim result1 As DateTime
if DateTime.TryParseExact(txtArticleDate.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, result1) Then
com1.Parameters.AddWithValue("@articledate", resul1)
Else
.....
而不是if DateTime.TryParseExact(txtArticleDate.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, result1) Then
com1.Parameters.Add("@articledate", SqlDbType.Datetime).Value = result1
com1.Parameters.AddWithValue("@season", General.sSeason)
com1.Parameters.AddWithValue("@heading", General.UppercaseFirstLetter(txtHeading.Text))
com1.Parameters.AddWithValue("@author", txtAuthor.Text)
com1.Parameters.AddWithValue("@club", ddlClub.SelectedItem.Value)
com1.Parameters.AddWithValue("@state", dsState.Tables(0).Rows(0).Item(0))
com1.Parameters.AddWithValue("@addeddate", Date.Today)
com1.Parameters.AddWithValue("@addedby", Session("UserID"))
' This is not used by the query, commented out
' com1.Parameters.AddWithValue("@updatedate", Date.Today)
' This is not used by the query, commented out
' com1.Parameters.AddWithValue("@updateby", Session("UserID"))
com1.Parameters.AddWithValue("@release", s)
com1.ExecuteNonQuery()
Else
MessageBox.Show("Date is not valid")
End If
)
ObjectCreate( chart_ID, // ref. doc
anInterimObjNAME, // a name to be used
OBJ_FIBO, // a type of GUI-obj to draw
0, // sub-window
time1, price1, // where to start
time2, price2 // where to finish
);
一般情况下,avoid AddWithValue更好,因为它会传递给你的任何内容。首选方法是
//--- set how many levels you want to paint
ObjectSetInteger( chart_ID,
anInterimObjNAME,
OBJPROP_LEVELS,
levels
);
//--- set the properties of each of the level
for ( int i = 0; i < levels; i++ )
{ ObjectSetDouble( chart_ID, anInterimObjNAME, OBJPROP_LEVELVALUE, i, values[i] ); // level value
ObjectSetInteger( chart_ID, anInterimObjNAME, OBJPROP_LEVELCOLOR, i, colors[i] ); // level color
ObjectSetInteger( chart_ID, anInterimObjNAME, OBJPROP_LEVELSTYLE, i, styles[i] ); // level style
ObjectSetInteger( chart_ID, anInterimObjNAME, OBJPROP_LEVELWIDTH, i, widths[i] ); // level width
ObjectSetString( chart_ID, anInterimObjNAME, OBJPROP_LEVELTEXT, i, DoubleToString( 100 * values[i], 1 ) ); // level description
}
我还删除了上面查询中未使用的两个参数(尽管它们不应该导致上面的错误消息)