Type字段是VARCHAR(45)且包含属性“目录”,为何遍历时if(directorie.getType()==“目录”),判断为否?请优化修改代码?
时间: 2024-09-14 19:10:27 浏览: 8
当`Type`字段是`VARCHAR(45)`,意味着它存储的是可变长度的字符串。如果`directorie.getType()`确实返回的是字符串"目录",但在判断时`if(directorie.getType()=="目录")`未通过,可能有以下几种情况:
1. **大小写问题**:数据库查询或字段值处理可能存在大小写敏感性。确保在比较时两个字符串的大小写一致。
2. **空格或特殊字符**:`"目录"` 后面有可能有空格或其他字符,导致不匹配。可以用 `trim()` 函数去除前后空白再做比较。
3. **NULL值**:`getType()` 可能返回 NULL,检查下是否进行了适当的 null 检测。
4. **数据类型转换**:尽管通常不需要手动类型转换,但确保在比较前没有隐式类型转换导致的异常。
为了优化,你可以尝试以下修改:
```java
String type = directorie.getType().trim();
boolean isDirectory = type != null && type.equalsIgnoreCase("目录");
if (isDirectory) {
// 执行相应操作
}
```
这里添加了对 `null` 和大小写的处理,并将判断合并成一个布尔表达式。这样可以更清晰地检查是否为"目录"。
相关问题
用MySQL8.0写代码,表stock_k_data AS T1 中字段有 ID,open, high, low, close,price,status用游标形式循环逐行计算, T1.字段名表示当前行,T2.字段名表示上一行, t1.ID= 2,循环到最后一行 , IF t2.status = "买入" AND t1.low<T2.price*0.95,THEN SET t1.status="卖出", t1.price=T2.price*0.95 IF t2.status = "买入" ,THEN t1.status="持有",t1.price=GREATEST(T2.price,T1.high) ELSEIF t2.status= "持有" AND t1.low<GREATEST(T2.price,T1.high)*0.95 ,THEN t1.status="卖出",t1.price=GREATEST(T2.price,T1.high)*0.95 ELSEIF t2.status= "持有" ,THEN t1.status="持有", t1.price=GREATEST(T2.price,T1.high) ELSEIF t2.status = "卖出" AND t1.high>T2.price*1.05,THEN t1.status="买入", t1.price=T2.price*1.05 ELSEIF t2.status = "卖出" ,THEN t1.status="空仓", t1.price=LEAST(T2.price,low) ELSEIF t2.status = "空仓" AND t1.high>LEAST(T2.price,low)*1.05,THEN t1.status="买入", t1.price=LEAST(T2.price,low)*1.05 ELSEIF t2.status = "卖出" ,THEN t1.status="空仓", t1.price=LEAST(T2.price,low) ENDIF
好的,下面是用MySQL8.0实现上述功能的代码:
```
DECLARE done INT DEFAULT FALSE;
DECLARE cur_id INT;
DECLARE cur_open FLOAT;
DECLARE cur_high FLOAT;
DECLARE cur_low FLOAT;
DECLARE cur_close FLOAT;
DECLARE cur_price FLOAT;
DECLARE cur_status VARCHAR(10);
DECLARE prev_id INT;
DECLARE prev_open FLOAT;
DECLARE prev_high FLOAT;
DECLARE prev_low FLOAT;
DECLARE prev_close FLOAT;
DECLARE prev_price FLOAT;
DECLARE prev_status VARCHAR(10);
DECLARE cur CURSOR FOR SELECT ID, open, high, low, close, price, status FROM stock_k_data WHERE ID >= 2 ORDER BY ID ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
FETCH cur INTO cur_id, cur_open, cur_high, cur_low, cur_close, cur_price, cur_status;
WHILE NOT done DO
IF prev_status = "买入" AND cur_low < prev_price * 0.95 THEN
SET cur_status = "卖出", cur_price = prev_price * 0.95;
ELSEIF prev_status = "买入" THEN
SET cur_status = "持有", cur_price = GREATEST(prev_price, cur_high);
ELSEIF prev_status = "持有" AND cur_low < GREATEST(prev_price, cur_high) * 0.95 THEN
SET cur_status = "卖出", cur_price = GREATEST(prev_price, cur_high) * 0.95;
ELSEIF prev_status = "持有" THEN
SET cur_status = "持有", cur_price = GREATEST(prev_price, cur_high);
ELSEIF prev_status = "卖出" AND cur_high > prev_price * 1.05 THEN
SET cur_status = "买入", cur_price = prev_price * 1.05;
ELSEIF prev_status = "卖出" THEN
SET cur_status = "空仓", cur_price = LEAST(prev_price, cur_low);
ELSEIF prev_status = "空仓" AND cur_high > LEAST(prev_price, cur_low) * 1.05 THEN
SET cur_status = "买入", cur_price = LEAST(prev_price, cur_low) * 1.05;
ELSEIF prev_status = "空仓" THEN
SET cur_status = "空仓", cur_price = LEAST(prev_price, cur_low);
END IF;
UPDATE stock_k_data SET status = cur_status, price = cur_price WHERE ID = cur_id;
SET prev_id = cur_id, prev_open = cur_open, prev_high = cur_high, prev_low = cur_low, prev_close = cur_close, prev_price = cur_price, prev_status = cur_status;
FETCH cur INTO cur_id, cur_open, cur_high, cur_low, cur_close, cur_price, cur_status;
END WHILE;
CLOSE cur;
```
该代码通过游标形式循环逐行计算表stock_k_data的数据,并按照给定的条件更新状态和价格。其中,使用了IF-ELSEIF-ELSE语句对不同的状态进行判断和处理。在每次更新完当前行的数据后,将当前行的数据赋值给prev_XXX变量,作为下一次循环时的上一行数据。最后,关闭游标。
sqlpara[0] = new SqlParameter("UserID", SqlDbType.VarChar, 50); sqlpara[0].Value = UserID;
这两行代码向 SqlParameter 数组的第一个元素添加了一个名为 "UserID" 的参数,并指定了参数的数据类型为 SqlDbType.VarChar,长度为 50。然后,将 UserID 变量的值赋给该参数的 Value 属性。
这意味着我们可以将这个 SqlParameter 对象用于执行 SQL 查询或存储过程中的参数化查询,并且可以使用 "UserID" 参数名来引用它。
下面是一个示例,展示了如何将 SqlParameter 数组用于执行参数化查询:
```csharp
string sql = "SELECT * FROM Users WHERE UserID=@UserID AND Password=@Password";
SqlParameter[] parameters = new SqlParameter[2];
parameters[0] = new SqlParameter("UserID", SqlDbType.VarChar, 50);
parameters[0].Value = UserID;
parameters[1] = new SqlParameter("Password", SqlDbType.VarChar, 50);
parameters[1].Value = Password;
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.AddRange(parameters);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["UserName"]);
}
reader.Close();
}
}
```
在这个示例中,我们首先创建了一个长度为 2 的 SqlParameter 数组,并向其中添加两个 SqlParameter 对象,分别代表 UserID 和 Password 参数。然后,我们将 UserID 和 Password 变量的值分别赋给这两个 SqlParameter 对象的 Value 属性。接着,我们创建了一个 SqlCommand 对象,并将查询语句和 SqlConnection 对象作为参数传递给它。然后,我们使用 AddRange 方法将 SqlParameter 数组中的所有元素添加到 SqlCommand 对象的参数列表中。最后,我们打开连接,执行查询,并读取结果集中的数据。
使用 SqlParameter 对象和 SqlParameter 数组可以有效地防止 SQL 注入攻击,并提高应用程序的安全性和可维护性。