繁体   English   中英

使用shell命令从C#程序中下载MySQL表是否合适?

[英]Is it appropriate to use a shell command to download MySQL tables from within a C# program?

我正在编写一个C#程序,该程序需要从REMOTE服务器中的MySQL数据库获取数据。 它将使用的Internet连接非常慢且不可靠,因此我想最小化正在传输的数据。

以下shell命令使MySQL可以将本地表中的数据作为* .txt文件存储在本地计算机中:

mysql.exe -u USERNAME -pPASSWORD -h REMOTE_SERVER_IP DB_NAME -e "SELECT * FROM table1" > C:/folder/file_name.txt

截至目前,我正在编写一个将执行此命令的C#程序。 但是,从Windows命令提示符执行此命令时,出现警告,提示“在命令行界面上使用密码可能不安全”。 我有几个问题:

1-它指的是哪种安全风险?

2-如果从另一个程序中执行此风险,是否仍然存在?

3-你们所有人都会使用相同的方法吗? 与直接使用MySqlConnection并调用SP将所有数据存储在RAM中(然后将其稍后插入本地数据库)相比,这在传输的数据量,速度和RAM使用率方面有何不同? (当然,从理论上讲,我不希望有人尝试过这种特定的比较)

4-以下链接上的代码是否最适合? MySql库(.Net Framework)中是否没有什么可以使它变得更容易?

如何从C#使用mysql.exe

我也乐于接受有关彻底改变我的方法的建议,以防万一...

编辑:我在3中提到的替代方法使用MySqlDataAdapter类,该类将数据存储在DataSets中。

1和2

当您将密码作为CLI参数传递时,如果它们显示在屏幕上,则任何人都可以看到您的密码。 就这么简单。

其余要点

您会将所有记录都存储到内存中并不是真的。 如果使用MySQL的IDataReader MySqlDataReader (即,需要调用MySqlCommand.ExecuteReader方法)实现,则可以像流一样顺序地从数据库中检索结果,因此,您可以逐一读取结果集中的每个结果并将其存储在使用FileStream的文件中。

  1. 它会在屏幕上,控制台输出或内存中以纯文本形式显示您的密码。
  2. 是,因为您需要以纯文本格式将密码存储在磁盘或内存中
  3. 如果您不担心有人可以访问您的远程计算机并在不知道密码的情况下窃取密码,那么就可以了
  4. 您可以尝试使用Windows Native Authentication Plugin ,它不需要存储密码,但是它将使用您当前的Windows登录信息进行身份验证。 (除非您在Linux上,然后再忘记它)

它与在没有掩码(点或*)的任何网站上键入密码的想法几乎相同。 是否要担心这取决于您自己决定。

为什么不使用MySqlConnection以标准方式(例如,从w / i .Net从w / i .Net连接到Oracle数据库)连接数据库,如此处MySql Connection所示。 然后,一旦这样做,就不必担心密码了,因为这在代码中。 然后,我认为我将以类似的方式处理该问题(逐步获取数据并在本地存储-绕开互联网问题)。

因此,我终于开始正确编码和测试这两种方法(shell命令和IDataReader),结果非常有趣。 每种方法总共对我的4张最重桌子进行了六次测试。 shell命令的方法平均需要1:00.3分钟,而DataReader则需要0:56.17分钟,因此我将继续使用它,因为总体上(并且相当一致)优势是4s。

但是,如果查看每个步骤的故障,C#似乎需要完整的8秒才能连接到数据库(下载表所需的时间为48.3秒,而以前的总数为48.3秒)。 如果您认为shell命令最有可能为正在下载的每个表建立和关闭新连接,那么在我看来,该过程中的某些操作实际上可以更快地连接到远程数据库。 另外,对于其中一个表,shell命令实际上要快2.9秒。 对于其余的表,在shell命令下只有一个慢了8秒以上。

我对将来的任何人的建议是,如果您仅获得一个大表,则使用shell命令。 对于下载多个表, IDataReader是更有效的选择,可能是因为它仅建立一次连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM