Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mysql更新查询中使用c-datetime_C#_Mysql_Dll - Fatal编程技术网

C# 在mysql更新查询中使用c-datetime

C# 在mysql更新查询中使用c-datetime,c#,mysql,dll,C#,Mysql,Dll,我正在尝试使用MySQL网站上的MySQL connector for.net从C运行一个到MySQL版本5.5.27的查询 我正在开发的.dll的最终目标是跟踪我读过的行 我用于读取数据库的查询是: string strSQL = "SELECT date,ask,bid,volume FROM gbpjpy where `read` = 0"; 在日期中,我有: DateTime dateTime = mysqlReader.GetDateTime(0); 那很好 该表有5列,最后一列称

我正在尝试使用MySQL网站上的MySQL connector for.net从C运行一个到MySQL版本5.5.27的查询

我正在开发的.dll的最终目标是跟踪我读过的行

我用于读取数据库的查询是:

string strSQL = "SELECT date,ask,bid,volume FROM gbpjpy where `read` = 0";
在日期中,我有:

DateTime dateTime = mysqlReader.GetDateTime(0);
那很好

该表有5列,最后一列称为read。select查询和解析完成后,我立即执行以下查询:

string sqlFormattedDate = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
string query = "UPDATE gbpjpy SET `read` = 1 WHERE `date` = " + sqlFormattedDate;
但是,当我检查日志时,出现以下错误:

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“01:20:08”附近要使用的正确语法

第一个读入的日期是2012/08/30 01:20:08,这是它在MySQL表中的显示方式,因此它从中获得01:20:08

我尝试了var sqlFormattedDate,使用破折号而不是斜杠和dateTime.ToString将ToString重载更改为yyyy MM dd,但都没有效果


为什么MySQL没有提取整个字符串?

基本上,您应该避免直接在查询中包含值

毫无疑问,你可以在价值周围加引号。。。但你不应该。相反,应该使用参数化SQL,并将值放入参数中。这样,您就不会进行容易出错的字符串转换,避免了字符串参数的SQL注入攻击,并将代码与数据分离

例如,您当前的代码将使用当前区域性的日期和时间分隔符,这可能不是/和:。您可以通过指定CultureInfo.InvariantCulture来修复此问题。。。但最好不要做任何转换


在您正在使用的任何命令类型上查找Parameters属性的文档,例如MySqlCommand.Parameters,它有望为您提供示例。文档中甚至可能有关于参数化SQL的教程部分。例如,可能就是您要找的对象。

我想您必须将日期的整个值用引号括起来。如果您实际连接查询,它将如下所示

UPDATE gbpjpy SET `read` = 1 WHERE `date` = yyyy/MM/dd HH:mm:ss
UPDATE gbpjpy SET `read` = 1 WHERE `date` = 'yyyy/MM/dd HH:mm:ss'
该等号仅在第一个空格之前取该值

相反,它应该看起来像

UPDATE gbpjpy SET `read` = 1 WHERE `date` = yyyy/MM/dd HH:mm:ss
UPDATE gbpjpy SET `read` = 1 WHERE `date` = 'yyyy/MM/dd HH:mm:ss'

这就是本例中的特殊原因,然而,像这样的连接查询会导致真正的错误。根据经验,你不应该这样做。您可以使用参数化查询,并且可能有一个用于执行此操作的.NET连接器的API。

将信息放入参数中可以根据需要格式化代码。您最初的问题可能是由于在日期格式中使用斜杠而不是破折号造成的。我假设斜杠可以工作,但我看到的大多数文档都有用MySqlDateTimes分隔日期的破折号。

在将日期附加到查询时,尝试在日期周围添加引号。谢谢你的想法。在搜索参数时,找到了这个页面上的小宝石。将我的代码修改为:string query=UPDATE gbpjpy SET read=1,其中date=@date;并添加了mysqlUpdateCmd.Parameters。Add@Date,MySqlDbType.DateTime.Value=DateTime;嘿,普雷斯托。再次感谢你的想法!有趣的是,我在上面的评论中提到的链接建议了一个类似的修复方法,尽管它确实解释了主要的缺点是您没有真正构建SQL命令,您正在生成一个字符串,并且您在本例中添加的所有变量(如date)都必须转换为字符串,这有其自身的问题。关于SQL注入,我在我的局域网上运行这个数据库,它不在网站上,也不对外开放。我可以假设这是我不必太担心的事情吗?你对用户的信任程度如何?如果在某一点上,有比你原来想象的更多的用户,他们想造成伤害,那该怎么办?这些最佳实践是有效的,因为软件需求和使用往往会发生变化。。。很多在你的位置上,我会避免串接字符串。实际上,这只是一个单人表演项目。这是一个个人项目。我是唯一的用户。最终,我会将数据库扩展到多台计算机,但即使如此,也只有我自己。实际上,我最终实现了Parameters.Add。不过,谢谢你的评论。