Вот один из способов: создать объект с именем Row для хранения каждой строки, а затем создать java.util.HashMap, ключи которого - целочисленные sij, а значения - соответствующие строки.
public class Example
{
public static class Row
{
public Integer sij;
public Integer i;
public Integer j;
public Row(Integer sij, Integer i, Integer j)
{
this.sij = sij;
this.i = i;
this.j = j;
}
}
public static void main(String[] args)
{
Row r1 = new Row(45, 5, 7);
Row r2 = new Row(33, 1, 6);
Row r3 = new Row(31, 0, 9);
Row r4 = new Row(12, 8, 2);
Map<Integer, Row> map = new TreeMap<Integer, Row>();
map.put(r1.sij, r1);
map.put(r2.sij, r2);
map.put(r3.sij, r3);
map.put(r4.sij, r4);
for ( Row row : map.values() ) {
System.out.println("sij: " + row.sij + " i: " + row.i + " j: " + row.j);
}
}
}
Когда это работает, он производит:
sij: 12 i: 8 j: 2
sij: 31 i: 0 j: 9
sij: 33 i: 1 j: 6
sij: 45 i: 5 j: 7
В общем, это невозможно сделать с помощью одного оператора.
Но SELECT SCOPE_IDENTITY () может (и должен) размещаться непосредственно после оператора INSERT, так что все готово в том же вызове базы данных.
Пример:
mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");
Вы можете использовать OUTPUT, но у него есть некоторые ограничения, о которых вы должны знать:
Это зависит от вашего вызывающего контекста.
Если вы вызываете это из клиентского кода, вы можете использовать ВЫХОД, а затем прочитать возвращаемое значение.
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))
INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')
Результат:
ColID
-----------
1
Если вы обертываете это в хранимой процедуре, использование OUTPUT - это больше работы. Там вы захотите использовать SCOPE_IDENTITY (), но вы не можете сделать это с помощью одного оператора. Конечно, вы можете поместить несколько операторов в одну строку с помощью символа ';' разделитель, но это не один оператор.
DECLARE @idValue int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))
INSERT INTO @t (ColStr) VALUES ('Hello World')
SELECT @idValue = SCOPE_IDENTITY()
Результат: переменная @idValue содержит значение идентичности. Используйте параметр OUTPUT, чтобы вернуть значение.
SELECT SCOPE_IDENTITY()
Редактировать: Есть игра ...
Если бы только предложение OUTPUT поддерживало локальные переменные.
В любом случае, чтобы получить диапазон идентификаторов, а не singleton
DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))
INSERT @Mytable (valuecol)
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'
Редактировать 2: За один вызов. У меня никогда не было возможности использовать эту конструкцию.
DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))
INSERT @Mytable (valuecol)
OUTPUT Inserted.keycol
VALUES('foobar')
Помимо @@ IDENTITY, вам также следует изучить SCOPE_IDENTITY () и IDENT_CURRENT (). Скорее всего, вам понадобится SCOPE_IDENTITY (). У @@ IDENTITY есть проблема, заключающаяся в том, что он может возвращать значение идентификатора, созданное в триггере в реальной таблице, которую вы пытаетесь отслеживать.
Кроме того, это функции с одним значением. Я не знаю, как работает ключевое слово Oracle RETURNING.
Вы можете неявно преобразовать массив символов в LPCSTR
без каких-либо преобразований:
void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);
LPCSTR
- это определение типа Windows для длинного указателя на постоянная строка. Еще в темные времена программирования Win16 были разные типы указателей: ближние указатели и дальние указатели, иногда также известные как короткие и длинные. указатели соответственно. Ближние указатели могли указывать только на сегмент памяти размером 64 КБ, определяемый одним из сегментных регистров x86. Далекие указатели могут указывать на что угодно. В настоящее время в Win32 с виртуальной памятью нет необходимости в ближних указателях - все указатели длинные.
Итак, LPSTR
- это определение типа для char *
или указателя к строке. LPCSTR
- это версия const
, т.е. это typedef для const char *
. В C массивы распадаются на указатели на свои первые элементы, поэтому char []
распадается на char *
. Наконец, любой тип «указателя на T» (для любого типа T) может быть неявно преобразован в «указатель на const T». Таким образом, объединив эти три факта, мы видим, что мы можем неявно преобразовать char []
в LPCSTR
.
В ответ на ваше изменение, я собираюсь предположить, что вы компилируете приложение Unicode. Если вы внимательно посмотрите документацию для CreateFile ()
, вы заметите, что параметр имени файла на самом деле является LPCTSTR
, а не LPCSTR
( обратите внимание на T
).
Практически для каждой функции Win32, которая принимает аргумент некоторого строкового типа (возможно, косвенно, т.е. как член структуры, переданной в качестве параметра), на самом деле существует две версии этой функции: одна, которая принимает 8-битный ANSI строки, и тот, который принимает строки 16-битных широких символов. Чтобы получить фактические имена функций, вы добавляете A
или W
к имени функции. Итак, ANSI-версия CreateFile ()
называется CreateFileA ()
, а версия для широких символов - CreateFileW ()
. В зависимости от того, компилируете ли вы с включенным Unicode (т.е. определен ли символ препроцессора _UNICODE
),
INSERT INTO table (foreign_key1, value) VALUES (9, 'text'); SELECT @@ IDENTITY;