ASP.NET/VB日期可在本地主机上工作,但不能在远程服务器上工作

ASP.NET/VB日期可在本地主机上工作,但不能在远程服务器上工作,asp.net,sql-server,vb.net,datetime,Asp.net,Sql Server,Vb.net,Datetime,我在试图从日期时间选择器获取日期以保存到我的数据库时遇到了很多麻烦。在本地主机上运行时,它可以正常工作,但在公共服务器上运行时则不行。 最初我使用cDate函数,另外还尝试了Convert.ToDateTime。但在服务器上,它现在给我一个错误“字符串未被识别为有效的日期时间。” 我研究发现最好使用DateTime.TryParse函数。在找到一个示例后,我为我的项目更改了它,现在我得到了一个错误“必须声明标量变量“@articledate” 调试项目时,添加到“result1”DateTime

我在试图从日期时间选择器获取日期以保存到我的数据库时遇到了很多麻烦。在本地主机上运行时,它可以正常工作,但在公共服务器上运行时则不行。 最初我使用cDate函数,另外还尝试了Convert.ToDateTime。但在服务器上,它现在给我一个错误“字符串未被识别为有效的日期时间。”

我研究发现最好使用DateTime.TryParse函数。在找到一个示例后,我为我的项目更改了它,现在我得到了一个错误“必须声明标量变量“@articledate”

调试项目时,添加到“result1”DateTime中的值是正确的。但它仍然在ExecuteOnQuery上抛出错误

如果有区别的话,主服务器由GoDaddy托管,Localhost是我的电脑

任何帮助或建议都将不胜感激

    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()
错误“必须声明标量变量”@articledate”是由键入错误引起的。添加参数时,应使用名为com1的SqlCommand变量,而不是变量com

但在此之后,您会遇到一个更严重的错误。所有方法都返回布尔值。转换的日期写入传递给TryParse的最后一个参数中

通过这种方式,您将一个布尔值传递给
AddWithValue
,此方法接受您在value参数中输入的任何内容。它无法知道您想要一个日期,因此它很乐意满足您的请求

应该这样做(注意,要使用的SqlCommand是
com1
而不是
com

总的来说,准确地说是更好的,因为它会接受你传递给它的任何东西

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

我还删除了上面查询中未使用的两个参数(尽管它们不应导致上面的错误消息)

设置日期选择器时,请说明格式是安全的、无歧义的格式,不受区域或语言设置的影响。
yyyymmdd
是安全的(
yyyy-mm-dd
不是,也不是,
m/d/y
d/m/y
)。感谢添加参数的提示。不幸的是,我仍然对日期有问题。当它到达If语句时,返回false。因此跳过添加参数并引发标量异常。“result1“声明时或运行If语句时设置?我已复制了上述代码(第二个答案)在我的项目中,但仍然抛出错误什么是确切的错误消息?考虑我已经设置了一个IF来检查输入日期是否正确。如果它不正确,那么你不应该执行查询。我将扩展第二个例子来更好地解释在调试时的流,如果是DATETIME.TYPARSEEXECUTE(TXTTAXEDATE.TEXT),DD MMYYYY,CultureInfo.InvariantCulture,DateTimeStyles.None,result1)则“将返回False。因此,在执行查询时,如果有帮助,则必须声明标量变量“@articledate”。txtArticledate,文本显示“28/01/2017”,结果1显示“12:00:00 AM”将格式掩码更改为dd/MM/yyyy,并使用CultureInfo.CurrentCulture(但如果指定了正确的日期分隔符,它可能也适用于InvariantCulture)或者最好遵循Aaron Bertrand关于使用格式正确的日期时间选择器而不是文本框的合理建议。你不再需要解析代码了。我接受了建议,去掉了文本框,只使用了日期时间选择器。虽然没有我希望的那么好,但它在不过度复杂的情况下完成了工作。谢谢你的帮助他来帮忙!
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