我正在尝试在记录中找到第一个空列,然后将数据保存到它。
我的代码第一次运行并将数据保存到第一列,之后它似乎什么也没做。有什么想法吗?
var col = 1;
var emptyCheck = "SELECT * FROM Pictures WHERE P" + col + " IS NULL AND ID=" + WebSecurity.CurrentUserId;
while (db.QueryValue(emptyCheck) == 0) {
col++;
};
if (db.QueryValue(emptyCheck) == 1) {
var update = "UPDATE Pictures SET P" + col + "='" + path + "' WHERE ID=" + WebSecurity.CurrentUserId;
db.Execute(update);
};
答案 0 :(得分:2)
根据您的示例代码和评论,我将建议采用更加规范化的方法。看起来好像你的图片表看起来像:
Pictures {
ID Int,
P1 varchar(??),
P2 varchar(??),
...
}
...我假设,P1..Pn是n列,包含一些图像文件的路径。正如之前的评论所说,这不是规范化的,也是一种糟糕的设计。它可能会完成工作,但它不具有可扩展性或高效性。将this article about normalization视为首发。如果您改为:
Pictures {
UserID Int,
PictureID Int,
PicturePath varchar(??)
}
...那么每个用户每个图像就有一行。 (UserID和PictureID的组合将是唯一的。因此每个用户可以具有1,2等的PictureID)然后您不必担心尝试找到“下一个空列”。您只需为每张新图片添加一个新行。
下一点......假设您出于某种原因要保留当前的表结构。 (不推荐。)您的逻辑表明您正在(可能)对数据库进行大量不必要的调用。您运行的每个查询都是数据库的往返。每次往返都需要资源和时间。只要有可能,您应该尝试减少应用程序需要进行的往返次数。您将获得更好的性能和更好的可扩展性。
最后一点......其中一条评论提到了SQL注入。您提供的代码容易受到SQL注入攻击。修复它是一件相当简单的事情。但是你确实需要查阅它并理解它是什么以及为什么你的代码容易受到攻击。
祝你好运!答案 1 :(得分:0)
首先,您的问题是:
var col = 1;
硬编码仅限于第一列。你需要围绕for循环包装你的逻辑。
for (var col = 1; col < MANUAL_LIMIT; col++) {
// Rest of your logic goes here
}
如上所述,如果您提供有关您尝试解决的问题的更多信息,我们可能会提供建议。