我正在开发一个遗留数据库,没有我可以修改的系统.由于类型提供程序,我决定使用F#.我现在并不是那么简单.如何在我的数据库中构建一个只包含以下字符串的字段?它有点像ENUM.我尝试了以下但是还没有完全理解.
尝试1
type SuspendedDriver = "SI"
type ActiveDriver = "IMPRESO"
type Applicant = "NO"
type TemporaryDriver = "TEMP"
type Uncertain = "NULL"
type DriverStatus =
| SuspendedDriver
| ActiveDriver
| Applicant
| TemporaryDriver
| Uncertain
type Driver = {
status : DriverStatus
}
Run Code Online (Sandbox Code Playgroud)
错误
Error FS0618: Invalid literal in type (FS0618) (ScriptTest)
Run Code Online (Sandbox Code Playgroud)
尝试2
type DriverStatus =
| SuspendedDriver = "SI"
| ActiveDriver = "IMPRESO"
| Applicant = "NO"
| TemporaryDriver = "TEMP"
| Uncertain = "NULL"
Run Code Online (Sandbox Code Playgroud)
错误
Error FS0951: Literal enumerations must have type int, uint, int16,
uint16, int64, uint64, byte, sbyte or char (FS0951) (ScriptTest)
Run Code Online (Sandbox Code Playgroud)
正如评论中所提到的,您无法定义具有擦除字符串值的枚举.枚举只能是整数(各种类型).
您可以使用枚举字段的实际名称,然后使用它们进行解析Enum.Parse,但这可能不是一个好主意,因为枚举案例将是相当模糊的代码.但只是为了记录,以下工作:
type DriverStatus =
| SI = 0
System.Enum.Parse(typeof<DriverStatus>, "SI") :?> DriverStatus
Run Code Online (Sandbox Code Playgroud)
在实践中,我会做Sam推荐的并编写一个函数来解析数据库中的字符串.这样做的好处是你需要弄清楚如何处理数据库中的错误(值总是错误的):
type DriverStatus =
| SuspendedDriver
| ActiveDriver
let parseDriverStatus = function
| "SI" -> SuspendedDriver
| "IMPRESO" -> ActiveDriver
| code -> failwith (sprintf "Wrong driver code! %s" code)
Run Code Online (Sandbox Code Playgroud)
最后,如果您碰巧使用的是MS SQL数据库,那么SQL命令提供程序项目有一个简洁的功能,可以让您自动从SQL数据库本身导入类似枚举的类型,这实际上可能正是您在这种情况下所需要的.
| 归档时间: |
|
| 查看次数: |
1073 次 |
| 最近记录: |